{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import library"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Import the relevant python library"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import datetime, os \n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "from tqdm import tqdm\n",
    "from torch.utils.data import DataLoader\n",
    "from torch.utils.tensorboard import SummaryWriter\n",
    "from utils.utils import DIAGNOSIS, EarlyStopping, RMSE, MSE, MAE, MAPE\n",
    "from utils.loaddataset import DataSet\n",
    "from model.net import DKNN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hyperparameter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Setting the hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "datafile ='SRF5s1_112_rand0.05s10_s5.csv'  #  sampled dataset in folder \"Data/dataset\". \n",
    "# The example \"SRF5s1_112_rand0.05s10_s5.csv\" denotes sampling at a rate of 5%, with a random seed of 10, from the random field \"SRF5s1_112.csv\", further partitioned into training and testing sets using a random seed of 5.\n",
    "\n",
    "batch_size = 128  # batch size\n",
    "lr = 0.0001  # learning rate\n",
    "hidden_neurons = [4, 256, 16]  # [input dimension, model dimension, trend dimension]. Note that the input dimension should be equal to the number of all variables (auxiliary and target) in the dataset\n",
    "pe_weight = 0.8  # weight of positional vector \n",
    "top_k = 400  # top k nearest neighbors\n",
    "loss_type = 'rmse'  # loss function type, default: rmse, options: rmse, mse, mae, mape\n",
    "optim_type='adam'  # optimizer type, default: adam, options: adam, sgd\n",
    "if_summary = True  # if save the training summary or not"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Test if GPU working or not"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Test for GPU and cuda acceleration, if not use cpu for training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "torch.cuda.empty_cache()\n",
    "print(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Read data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Read the sampled dataset. Data format required: csv file, columns are organised as: id, coodx, coody, auxiliary variables (q in total, each variable corresponds to a column), target variable, and the dataset type (the last column)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     id  coodx  coody        z1        z2        z3     target dataset\n",
      "0   937     37      9  1.105420 -0.150936  0.183699   4.026431    test\n",
      "1  9355     55     93  0.135998 -2.392647 -3.141612   7.740979    test\n",
      "2  2293     93     22  2.819956  2.319428 -2.123234   9.742294   train\n",
      "3   192     92      1  2.394848  3.182256 -7.373889   4.645330    test\n",
      "4  8675     75     86 -0.621343 -0.263974  0.867634  12.388022   train\n"
     ]
    }
   ],
   "source": [
    "datapath = './Data/dataset/' + datafile\n",
    "# read the data\n",
    "data = pd.read_csv(datapath)\n",
    "print(data.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Preprocessing  data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data is loaded and scaled by the DataSet class to get a dataset instance. The training and test sets are obtained and converted to dataloader. As an interpolation model, DKNN treats the training set as known points  (observed locations), based on which the values of interest of the unknown points (unobserved locations) is estimated."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data_train_scaler:\n",
      "               id       coodx       coody          z1            z2  \\\n",
      "count  400.000000  400.000000  400.000000  400.000000  4.000000e+02   \n",
      "mean   199.500000    0.497904    0.453081    0.000000 -3.108624e-17   \n",
      "std    115.614301    0.298986    0.288832    1.001252  1.001252e+00   \n",
      "min      0.000000    0.000000    0.000000   -3.209412 -2.304838e+00   \n",
      "25%     99.750000    0.232323    0.199495   -0.551142 -7.105072e-01   \n",
      "50%    199.500000    0.515152    0.414141    0.148037  3.256333e-02   \n",
      "75%    299.250000    0.757576    0.696970    0.662290  5.711694e-01   \n",
      "max    399.000000    1.000000    1.000000    2.859259  2.797601e+00   \n",
      "\n",
      "                 z3        target  \n",
      "count  4.000000e+02  4.000000e+02  \n",
      "mean  -8.881784e-18  5.107026e-17  \n",
      "std    1.001252e+00  1.001252e+00  \n",
      "min   -3.326120e+00 -1.875793e+00  \n",
      "25%   -5.125156e-01 -7.698804e-01  \n",
      "50%    1.658150e-01  2.206906e-02  \n",
      "75%    6.468011e-01  7.073807e-01  \n",
      "max    2.350142e+00  2.192478e+00  \n"
     ]
    }
   ],
   "source": [
    "# Load data via class DataSet\n",
    "dataset = DataSet(data)\n",
    "\n",
    "# Scaling the data\n",
    "data_scaler = dataset.scaler_data()\n",
    "\n",
    "# get the scaled train data and  test data\n",
    "data_train_scaler = data_scaler['train']\n",
    "data_test_scaler = data_scaler['test']\n",
    "print('data_train_scaler:')\n",
    "print(data_train_scaler.describe())\n",
    "\n",
    "# get the dataloader\n",
    "train_dataloader = DataLoader(data_train_scaler.values.astype(float), shuffle=True, batch_size=batch_size, drop_last=False)\n",
    "test_dataloader = DataLoader(data_test_scaler.values.astype(float), shuffle=False, batch_size=batch_size, drop_last=False) \n",
    "\n",
    "# Take the training set as known point data (observed locations)\n",
    "known_coods_scaler = data_train_scaler.values[:, 1:3]\n",
    "known_feature_scaler = data_train_scaler.values[:, 3:]\n",
    "\n",
    "# tramsform the data to tensor\n",
    "known_coods_scaler = torch.from_numpy((known_coods_scaler.astype(float))).to(torch.float32).to(device)\n",
    "known_feature_scaler = torch.from_numpy(known_feature_scaler.astype(float)).to(torch.float32).to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DKNN model initialization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DKNN model initialisation, defining the DKNN model structure based on hyperparameters and calculating the positional embeddings in advance, in order to avoid redundant calculations during the training process and to improve the training efficiency"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DKNN(\n",
       "  (AttRe): Attribute_Rep(\n",
       "    (dense1): Dense(\n",
       "      (fc): Linear(in_features=4, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense2): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense3): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (relu): PReLU(num_parameters=1)\n",
       "  )\n",
       "  (Pgrn): PGRN(\n",
       "    (dense1): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense12): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense2): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense3): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (sigmoid): Sigmoid()\n",
       "    (bn): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  )\n",
       "  (Ssan): SSAN(\n",
       "    (map_query): Linear(in_features=256, out_features=256, bias=False)\n",
       "    (map_key): Linear(in_features=256, out_features=256, bias=False)\n",
       "  )\n",
       "  (MetaPN): MetaPN(\n",
       "    (ml1_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=512, bias=True)\n",
       "    )\n",
       "    (ml1_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (ml2_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=65536, bias=True)\n",
       "    )\n",
       "    (ml2_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (ml3_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=4096, bias=True)\n",
       "    )\n",
       "    (ml3_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=16, bias=True)\n",
       "    )\n",
       "    (relu): PReLU(num_parameters=1)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Define the DKNN model \n",
    "modelname = 'DKNN'\n",
    "d_input, d_model, d_trend = hidden_neurons\n",
    "model = DKNN(d_input=d_input, d_model=d_model, known_num=dataset.train_num, d_trend=d_trend, top_k=top_k, pe_weight=pe_weight)\n",
    "\n",
    "# Calculate positional embeddings before training to increase the speed of training\n",
    "model.cal_pe_know(known_feature_scaler, known_coods_scaler)\n",
    "model.cal_pe_unknow(torch.from_numpy(data_test_scaler.values[:, 3:3+d_input].astype(float)).to(torch.float32).to(device),\n",
    "                    torch.from_numpy(data_test_scaler.values[:, 1:3].astype(float)).to(torch.float32).to(device)) \n",
    "model.to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Model training based on sampled dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Loss function and optimizer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Defining loss functions and optimizers based on hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "##### loss function ##### \n",
    "if loss_type=='mae':\n",
    "    criterion = MAE()\n",
    "elif loss_type=='mse':\n",
    "    criterion = MSE()\n",
    "elif loss_type=='rmse':\n",
    "    criterion = RMSE()\n",
    "elif loss_type=='mape':\n",
    "    criterion = MAPE()\n",
    "\n",
    "##### optimizer #####\n",
    "if optim_type=='adam':\n",
    "    optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=0)\n",
    "elif optim_type=='sgd':\n",
    "    optimizer = optim.SGD(model.parameters(), lr=lr, weight_decay=0)\n",
    "    \n",
    "# learning rate decay \n",
    "scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', factor=0.8,  verbose=True, patience=5, min_lr=1e-6)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build a SummaryWriter base on TensorBoard"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Determine whether to build a SummaryWriter based on the TensorBoard library according to the hyperparameter if_summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "summary path: \n",
      "./results/DKNN/SRF5s1_112_rand0.05s10_s5/0408_153945/summary/\n"
     ]
    }
   ],
   "source": [
    "# get the datafile name\n",
    "datafile = datapath[datapath.rfind('/')+1:]\n",
    "datafilename = datafile[0:datafile.rfind('.')]\n",
    "\n",
    "# get the save path\n",
    "start_time = datetime.datetime.now()\n",
    "train_info = start_time.strftime(\"%m%d_%H%M%S\")\n",
    "save_dir = './results/' +  modelname + '/' + datafilename + '/' + train_info\n",
    "\n",
    "# get the summary path and build the summarywriter\n",
    "if if_summary:\n",
    "    summarypath = save_dir + '/summary/'\n",
    "    writer = SummaryWriter(summarypath)\n",
    "    print('summary path: \\n' + summarypath)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training process"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Iterate for model training and save the best model parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0408_153945  start\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/300 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 0,step 0,loss: 12.78273, RMSE:12.78273,MSE:163.39810, MAE:10.38738, MAPE:41.43253--\n",
      "\n",
      "--------train epoch 0,step 3,loss: 8.44687, RMSE:8.44687,MSE:71.34966, MAE:7.05297, MAPE:37.96288--\n",
      "--------test loss: 10.84069, RMSE:10.84069,MSE:117.52065, MAPE:27.10550, RMSE_inv:41.06104, epoch time:0.00m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 1/300 [00:00<03:31,  1.42it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (inf --> 10.840694).  Saving model ...\n",
      "\n",
      "--------train epoch 1,step 0,loss: 11.20895, RMSE:11.20895,MSE:125.64053, MAE:9.98404, MAPE:39.61548--\n",
      "\n",
      "--------train epoch 1,step 3,loss: 6.58927, RMSE:6.58927,MSE:43.41850, MAE:6.45462, MAPE:11.29131--\n",
      "--------test loss: 1.45158, RMSE:1.45158,MSE:2.10708, MAPE:5.16621, RMSE_inv:5.49811, epoch time:0.00m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  1%|          | 3/300 [00:01<01:59,  2.49it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (10.840694 --> 1.451580).  Saving model ...\n",
      "\n",
      "--------train epoch 2,step 0,loss: 1.58123, RMSE:1.58123,MSE:2.50028, MAE:1.41205, MAPE:5.58255--\n",
      "\n",
      "--------train epoch 2,step 3,loss: 2.11554, RMSE:2.11554,MSE:4.47552, MAE:1.90525, MAPE:5.17203--\n",
      "--------test loss: 3.42609, RMSE:3.42609,MSE:11.73808, MAPE:17.46070, RMSE_inv:12.97691, epoch time:0.02m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 3,step 0,loss: 2.84692, RMSE:2.84692,MSE:8.10496, MAE:2.45697, MAPE:10.97979--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  1%|▏         | 4/300 [00:01<01:32,  3.20it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 3,step 3,loss: 1.43507, RMSE:1.43507,MSE:2.05943, MAE:1.26686, MAPE:2.89337--\n",
      "--------test loss: 2.74090, RMSE:2.74090,MSE:7.51254, MAPE:11.10899, RMSE_inv:10.38165, epoch time:0.02m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 4,step 0,loss: 2.34991, RMSE:2.34991,MSE:5.52207, MAE:1.94113, MAPE:7.71114--\n",
      "\n",
      "--------train epoch 4,step 3,loss: 1.49258, RMSE:1.49258,MSE:2.22781, MAE:1.38501, MAPE:5.67126--\n",
      "--------test loss: 0.83165, RMSE:0.83165,MSE:0.69163, MAPE:3.94483, RMSE_inv:3.15000, epoch time:0.02m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  2%|▏         | 5/300 [00:02<01:52,  2.63it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (1.451580 --> 0.831646).  Saving model ...\n",
      "\n",
      "--------train epoch 5,step 0,loss: 0.81990, RMSE:0.81990,MSE:0.67223, MAE:0.72128, MAPE:1.97391--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  2%|▏         | 6/300 [00:02<01:38,  2.97it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 5,step 3,loss: 0.74595, RMSE:0.74595,MSE:0.55645, MAE:0.59768, MAPE:2.92236--\n",
      "--------test loss: 1.24473, RMSE:1.24473,MSE:1.54936, MAPE:5.83612, RMSE_inv:4.71464, epoch time:0.03m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 6,step 0,loss: 1.28829, RMSE:1.28829,MSE:1.65970, MAE:1.21977, MAPE:4.28422--\n",
      "\n",
      "--------train epoch 6,step 3,loss: 0.65668, RMSE:0.65668,MSE:0.43122, MAE:0.56039, MAPE:2.41105--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  2%|▏         | 7/300 [00:02<01:25,  3.44it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.95940, RMSE:0.95940,MSE:0.92044, MAPE:3.81431, RMSE_inv:3.63388, epoch time:0.03m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 7,step 0,loss: 0.90475, RMSE:0.90475,MSE:0.81857, MAE:0.81801, MAPE:2.48939--\n",
      "\n",
      "--------train epoch 7,step 3,loss: 0.80458, RMSE:0.80458,MSE:0.64735, MAE:0.73941, MAPE:3.18134--\n",
      "--------test loss: 0.78152, RMSE:0.78152,MSE:0.61078, MAPE:3.97294, RMSE_inv:2.96015, epoch time:0.03m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  3%|▎         | 8/300 [00:03<01:55,  2.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.831646 --> 0.781523).  Saving model ...\n",
      "\n",
      "--------train epoch 8,step 0,loss: 0.78935, RMSE:0.78935,MSE:0.62307, MAE:0.69808, MAPE:3.47572--\n",
      "\n",
      "--------train epoch 8,step 3,loss: 0.70147, RMSE:0.70147,MSE:0.49206, MAE:0.63423, MAPE:2.11485--\n",
      "--------test loss: 0.37325, RMSE:0.37325,MSE:0.13932, MAPE:1.47930, RMSE_inv:1.41375, epoch time:0.05m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  3%|▎         | 9/300 [00:03<02:12,  2.20it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.781523 --> 0.373251).  Saving model ...\n",
      "\n",
      "--------train epoch 9,step 0,loss: 0.38476, RMSE:0.38476,MSE:0.14804, MAE:0.30152, MAPE:1.02230--\n",
      "\n",
      "--------train epoch 9,step 3,loss: 0.22546, RMSE:0.22546,MSE:0.05083, MAE:0.19776, MAPE:1.93633--\n",
      "--------test loss: 0.78658, RMSE:0.78658,MSE:0.61871, MAPE:3.02357, RMSE_inv:2.97930, epoch time:0.05m--\n",
      "EarlyStopping counter: 1 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  4%|▎         | 11/300 [00:04<01:33,  3.09it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 10,step 0,loss: 0.72787, RMSE:0.72787,MSE:0.52980, MAE:0.65349, MAPE:2.93435--\n",
      "\n",
      "--------train epoch 10,step 3,loss: 0.66278, RMSE:0.66278,MSE:0.43927, MAE:0.54862, MAPE:1.77289--\n",
      "--------test loss: 0.56746, RMSE:0.56746,MSE:0.32201, MAPE:2.06608, RMSE_inv:2.14936, epoch time:0.07m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 11,step 0,loss: 0.46856, RMSE:0.46856,MSE:0.21955, MAE:0.38927, MAPE:1.12449--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  4%|▍         | 12/300 [00:04<01:23,  3.45it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 11,step 3,loss: 0.42820, RMSE:0.42820,MSE:0.18336, MAE:0.35598, MAPE:0.82157--\n",
      "--------test loss: 0.78498, RMSE:0.78498,MSE:0.61620, MAPE:3.47973, RMSE_inv:2.97326, epoch time:0.07m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 12,step 0,loss: 0.83141, RMSE:0.83141,MSE:0.69124, MAE:0.73633, MAPE:2.42764--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  4%|▍         | 13/300 [00:04<01:17,  3.68it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 12,step 3,loss: 0.68172, RMSE:0.68172,MSE:0.46475, MAE:0.60434, MAPE:2.31570--\n",
      "--------test loss: 0.86006, RMSE:0.86006,MSE:0.73970, MAPE:4.26434, RMSE_inv:3.25762, epoch time:0.07m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 13,step 0,loss: 0.83637, RMSE:0.83637,MSE:0.69952, MAE:0.74407, MAPE:3.31263--\n",
      "\n",
      "--------train epoch 13,step 3,loss: 0.65057, RMSE:0.65057,MSE:0.42325, MAE:0.54633, MAPE:3.95215--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  5%|▌         | 15/300 [00:04<01:04,  4.42it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.38120, RMSE:0.38120,MSE:0.14532, MAPE:1.52906, RMSE_inv:1.44388, epoch time:0.07m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 14,step 0,loss: 0.42167, RMSE:0.42167,MSE:0.17780, MAE:0.33681, MAPE:2.48255--\n",
      "\n",
      "--------train epoch 14,step 3,loss: 0.40080, RMSE:0.40080,MSE:0.16064, MAE:0.30194, MAPE:0.77936--\n",
      "Epoch 00015: reducing learning rate of group 0 to 8.0000e-05.\n",
      "--------test loss: 0.83017, RMSE:0.83017,MSE:0.68919, MAPE:3.35327, RMSE_inv:3.14443, epoch time:0.07m--\n",
      "EarlyStopping counter: 6 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  5%|▌         | 16/300 [00:05<01:00,  4.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 15,step 0,loss: 0.73757, RMSE:0.73757,MSE:0.54402, MAE:0.63908, MAPE:1.84240--\n",
      "\n",
      "--------train epoch 15,step 3,loss: 0.57131, RMSE:0.57131,MSE:0.32639, MAE:0.50714, MAPE:3.62969--\n",
      "--------test loss: 0.90318, RMSE:0.90318,MSE:0.81574, MAPE:3.94577, RMSE_inv:3.42097, epoch time:0.08m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 16,step 0,loss: 0.79053, RMSE:0.79053,MSE:0.62493, MAE:0.67124, MAPE:3.39720--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  6%|▌         | 17/300 [00:05<00:59,  4.78it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 16,step 3,loss: 0.46363, RMSE:0.46363,MSE:0.21495, MAE:0.37674, MAPE:1.27769--\n",
      "--------test loss: 0.58561, RMSE:0.58561,MSE:0.34294, MAPE:2.65315, RMSE_inv:2.21811, epoch time:0.08m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 17,step 0,loss: 0.53906, RMSE:0.53906,MSE:0.29058, MAE:0.44538, MAPE:1.29853--\n",
      "\n",
      "--------train epoch 17,step 3,loss: 0.45454, RMSE:0.45454,MSE:0.20661, MAE:0.34770, MAPE:2.46942--\n",
      "--------test loss: 0.29350, RMSE:0.29350,MSE:0.08614, MAPE:0.95014, RMSE_inv:1.11167, epoch time:0.08m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  6%|▌         | 18/300 [00:05<01:26,  3.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.373251 --> 0.293497).  Saving model ...\n",
      "\n",
      "--------train epoch 18,step 0,loss: 0.30844, RMSE:0.30844,MSE:0.09513, MAE:0.23709, MAPE:0.77191--\n",
      "\n",
      "--------train epoch 18,step 3,loss: 0.36030, RMSE:0.36030,MSE:0.12982, MAE:0.31540, MAPE:3.40032--\n",
      "--------test loss: 0.38568, RMSE:0.38568,MSE:0.14875, MAPE:0.96655, RMSE_inv:1.46083, epoch time:0.10m--\n",
      "EarlyStopping counter: 1 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  7%|▋         | 20/300 [00:06<01:11,  3.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 19,step 0,loss: 0.41745, RMSE:0.41745,MSE:0.17426, MAE:0.33697, MAPE:1.33458--\n",
      "\n",
      "--------train epoch 19,step 3,loss: 0.38617, RMSE:0.38617,MSE:0.14912, MAE:0.31957, MAPE:1.89480--\n",
      "--------test loss: 0.45802, RMSE:0.45802,MSE:0.20978, MAPE:1.17942, RMSE_inv:1.73482, epoch time:0.10m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 20,step 0,loss: 0.41237, RMSE:0.41237,MSE:0.17005, MAE:0.32096, MAPE:0.87476--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  7%|▋         | 21/300 [00:06<01:07,  4.10it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 20,step 3,loss: 0.22419, RMSE:0.22419,MSE:0.05026, MAE:0.19275, MAPE:0.62009--\n",
      "--------test loss: 0.32779, RMSE:0.32779,MSE:0.10745, MAPE:1.85854, RMSE_inv:1.24156, epoch time:0.10m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 21,step 0,loss: 0.31552, RMSE:0.31552,MSE:0.09955, MAE:0.25662, MAPE:0.92788--\n",
      "\n",
      "--------train epoch 21,step 3,loss: 0.32078, RMSE:0.32078,MSE:0.10290, MAE:0.26004, MAPE:3.65799--\n",
      "--------test loss: 0.38881, RMSE:0.38881,MSE:0.15118, MAPE:1.25761, RMSE_inv:1.47270, epoch time:0.10m--\n",
      "EarlyStopping counter: 4 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  7%|▋         | 22/300 [00:06<01:03,  4.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 22,step 0,loss: 0.39832, RMSE:0.39832,MSE:0.15866, MAE:0.35650, MAPE:1.18416--\n",
      "\n",
      "--------train epoch 22,step 3,loss: 0.38578, RMSE:0.38578,MSE:0.14883, MAE:0.33624, MAPE:0.63120--\n",
      "--------test loss: 0.25632, RMSE:0.25632,MSE:0.06570, MAPE:0.75984, RMSE_inv:0.97086, epoch time:0.10m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  8%|▊         | 23/300 [00:07<01:25,  3.25it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.293497 --> 0.256320).  Saving model ...\n",
      "\n",
      "--------train epoch 23,step 0,loss: 0.24048, RMSE:0.24048,MSE:0.05783, MAE:0.19662, MAPE:0.70372--\n",
      "\n",
      "--------train epoch 23,step 3,loss: 0.29998, RMSE:0.29998,MSE:0.08999, MAE:0.21429, MAPE:0.56753--\n",
      "--------test loss: 0.24276, RMSE:0.24276,MSE:0.05893, MAPE:0.69332, RMSE_inv:0.91950, epoch time:0.12m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  8%|▊         | 24/300 [00:07<01:43,  2.67it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.256320 --> 0.242761).  Saving model ...\n",
      "\n",
      "--------train epoch 24,step 0,loss: 0.25605, RMSE:0.25605,MSE:0.06556, MAE:0.21094, MAPE:0.93457--\n",
      "\n",
      "--------train epoch 24,step 3,loss: 0.19453, RMSE:0.19453,MSE:0.03784, MAE:0.16792, MAPE:0.36652--\n",
      "--------test loss: 0.21334, RMSE:0.21334,MSE:0.04551, MAPE:0.62062, RMSE_inv:0.80806, epoch time:0.12m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  8%|▊         | 25/300 [00:08<02:31,  1.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.242761 --> 0.213340).  Saving model ...\n",
      "\n",
      "--------train epoch 25,step 0,loss: 0.19068, RMSE:0.19068,MSE:0.03636, MAE:0.15300, MAPE:0.74054--\n",
      "\n",
      "--------train epoch 25,step 3,loss: 0.19866, RMSE:0.19866,MSE:0.03946, MAE:0.12885, MAPE:0.12447--\n",
      "--------test loss: 0.25100, RMSE:0.25100,MSE:0.06300, MAPE:0.89698, RMSE_inv:0.95069, epoch time:0.13m--\n",
      "EarlyStopping counter: 1 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  9%|▉         | 27/300 [00:09<01:39,  2.74it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 26,step 0,loss: 0.23196, RMSE:0.23196,MSE:0.05381, MAE:0.18695, MAPE:0.72190--\n",
      "\n",
      "--------train epoch 26,step 3,loss: 0.26289, RMSE:0.26289,MSE:0.06911, MAE:0.22732, MAPE:1.29977--\n",
      "--------test loss: 0.25663, RMSE:0.25663,MSE:0.06586, MAPE:0.78528, RMSE_inv:0.97203, epoch time:0.15m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 27,step 0,loss: 0.24397, RMSE:0.24397,MSE:0.05952, MAE:0.19761, MAPE:0.93093--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  9%|▉         | 28/300 [00:09<01:24,  3.22it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 27,step 3,loss: 0.21649, RMSE:0.21649,MSE:0.04687, MAE:0.16878, MAPE:2.54602--\n",
      "--------test loss: 0.35367, RMSE:0.35367,MSE:0.12508, MAPE:1.49198, RMSE_inv:1.33958, epoch time:0.15m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 28,step 0,loss: 0.34495, RMSE:0.34495,MSE:0.11899, MAE:0.28451, MAPE:1.45659--\n",
      "\n",
      "--------train epoch 28,step 3,loss: 0.23585, RMSE:0.23585,MSE:0.05563, MAE:0.19747, MAPE:0.67369--\n",
      "--------test loss: 0.18896, RMSE:0.18896,MSE:0.03571, MAPE:0.80910, RMSE_inv:0.71574, epoch time:0.15m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 10%|▉         | 29/300 [00:09<01:47,  2.52it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.213340 --> 0.188965).  Saving model ...\n",
      "\n",
      "--------train epoch 29,step 0,loss: 0.16526, RMSE:0.16526,MSE:0.02731, MAE:0.13300, MAPE:0.47303--\n",
      "\n",
      "--------train epoch 29,step 3,loss: 0.12994, RMSE:0.12994,MSE:0.01688, MAE:0.12111, MAPE:0.31105--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 10%|█         | 30/300 [00:10<01:34,  2.85it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.28444, RMSE:0.28444,MSE:0.08091, MAPE:1.19693, RMSE_inv:1.07737, epoch time:0.17m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 30,step 0,loss: 0.27623, RMSE:0.27623,MSE:0.07630, MAE:0.21318, MAPE:0.74355--\n",
      "\n",
      "--------train epoch 30,step 3,loss: 0.29089, RMSE:0.29089,MSE:0.08461, MAE:0.26479, MAPE:1.58148--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 11%|█         | 32/300 [00:10<01:14,  3.59it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.54514, RMSE:0.54514,MSE:0.29718, MAPE:1.99391, RMSE_inv:2.06481, epoch time:0.17m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 31,step 0,loss: 0.48911, RMSE:0.48911,MSE:0.23922, MAE:0.42808, MAPE:2.05774--\n",
      "\n",
      "--------train epoch 31,step 3,loss: 0.70443, RMSE:0.70443,MSE:0.49622, MAE:0.59218, MAPE:1.78235--\n",
      "--------test loss: 0.34807, RMSE:0.34807,MSE:0.12115, MAPE:1.31264, RMSE_inv:1.31837, epoch time:0.17m--\n",
      "EarlyStopping counter: 3 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 11%|█         | 33/300 [00:10<01:07,  3.94it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 32,step 0,loss: 0.31030, RMSE:0.31030,MSE:0.09629, MAE:0.25844, MAPE:0.68797--\n",
      "\n",
      "--------train epoch 32,step 3,loss: 0.46612, RMSE:0.46612,MSE:0.21727, MAE:0.32111, MAPE:0.46280--\n",
      "--------test loss: 0.63443, RMSE:0.63443,MSE:0.40250, MAPE:3.48171, RMSE_inv:2.40302, epoch time:0.17m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 33,step 0,loss: 0.61771, RMSE:0.61771,MSE:0.38156, MAE:0.51157, MAPE:2.13508--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 11%|█▏        | 34/300 [00:10<01:06,  4.01it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 33,step 3,loss: 0.52000, RMSE:0.52000,MSE:0.27040, MAE:0.42879, MAPE:4.95770--\n",
      "--------test loss: 0.74367, RMSE:0.74367,MSE:0.55305, MAPE:3.99468, RMSE_inv:2.81679, epoch time:0.17m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 34,step 0,loss: 0.65479, RMSE:0.65479,MSE:0.42875, MAE:0.56648, MAPE:2.37942--\n",
      "\n",
      "--------train epoch 34,step 3,loss: 0.64115, RMSE:0.64115,MSE:0.41107, MAE:0.52715, MAPE:2.13847--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 12%|█▏        | 36/300 [00:11<00:56,  4.65it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 00035: reducing learning rate of group 0 to 6.4000e-05.\n",
      "--------test loss: 1.65661, RMSE:1.65661,MSE:2.74435, MAPE:8.14087, RMSE_inv:6.27470, epoch time:0.18m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 35,step 0,loss: 1.68885, RMSE:1.68885,MSE:2.85222, MAE:1.60303, MAPE:6.57291--\n",
      "\n",
      "--------train epoch 35,step 3,loss: 0.46879, RMSE:0.46879,MSE:0.21976, MAE:0.38838, MAPE:0.90653--\n",
      "--------test loss: 0.75997, RMSE:0.75997,MSE:0.57755, MAPE:2.33855, RMSE_inv:2.87850, epoch time:0.18m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 36,step 0,loss: 0.81087, RMSE:0.81087,MSE:0.65751, MAE:0.73342, MAPE:3.79415--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 12%|█▏        | 37/300 [00:11<00:52,  4.98it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 36,step 3,loss: 0.78666, RMSE:0.78666,MSE:0.61883, MAE:0.63459, MAPE:1.40082--\n",
      "--------test loss: 0.85187, RMSE:0.85187,MSE:0.72569, MAPE:2.93013, RMSE_inv:3.22662, epoch time:0.18m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 37,step 0,loss: 0.76611, RMSE:0.76611,MSE:0.58692, MAE:0.62580, MAPE:1.90843--\n",
      "\n",
      "--------train epoch 37,step 3,loss: 0.76932, RMSE:0.76932,MSE:0.59185, MAE:0.66117, MAPE:2.88762--\n",
      "--------test loss: 0.55524, RMSE:0.55524,MSE:0.30829, MAPE:2.49841, RMSE_inv:2.10306, epoch time:0.18m--\n",
      "EarlyStopping counter: 9 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 13%|█▎        | 39/300 [00:11<00:46,  5.58it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 38,step 0,loss: 0.57736, RMSE:0.57736,MSE:0.33335, MAE:0.46769, MAPE:3.50021--\n",
      "\n",
      "--------train epoch 38,step 3,loss: 0.77295, RMSE:0.77295,MSE:0.59745, MAE:0.64971, MAPE:2.03818--\n",
      "--------test loss: 0.72811, RMSE:0.72811,MSE:0.53015, MAPE:3.02548, RMSE_inv:2.75785, epoch time:0.18m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 39,step 0,loss: 0.68778, RMSE:0.68778,MSE:0.47305, MAE:0.61913, MAPE:3.71391--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 14%|█▎        | 41/300 [00:12<00:42,  6.14it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 39,step 3,loss: 0.71693, RMSE:0.71693,MSE:0.51399, MAE:0.66000, MAPE:3.00202--\n",
      "--------test loss: 0.40334, RMSE:0.40334,MSE:0.16268, MAPE:1.81054, RMSE_inv:1.52772, epoch time:0.18m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 40,step 0,loss: 0.48337, RMSE:0.48337,MSE:0.23365, MAE:0.36748, MAPE:1.95942--\n",
      "\n",
      "--------train epoch 40,step 3,loss: 0.43523, RMSE:0.43523,MSE:0.18942, MAE:0.35024, MAPE:1.16028--\n",
      "Epoch 00041: reducing learning rate of group 0 to 5.1200e-05.\n",
      "--------test loss: 0.68047, RMSE:0.68047,MSE:0.46304, MAPE:1.63218, RMSE_inv:2.57741, epoch time:0.20m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 41,step 0,loss: 0.58174, RMSE:0.58174,MSE:0.33842, MAE:0.46657, MAPE:1.26919--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 14%|█▍        | 42/300 [00:12<00:44,  5.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 41,step 3,loss: 0.32135, RMSE:0.32135,MSE:0.10326, MAE:0.30101, MAPE:3.51604--\n",
      "--------test loss: 0.42918, RMSE:0.42918,MSE:0.18420, MAPE:1.57640, RMSE_inv:1.62561, epoch time:0.20m--\n",
      "EarlyStopping counter: 13 out of 30\n",
      "\n",
      "--------train epoch 42,step 0,loss: 0.41505, RMSE:0.41505,MSE:0.17227, MAE:0.36860, MAPE:1.36299--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 14%|█▍        | 43/300 [00:12<00:49,  5.23it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 42,step 3,loss: 0.39726, RMSE:0.39726,MSE:0.15781, MAE:0.34853, MAPE:0.82688--\n",
      "--------test loss: 0.30260, RMSE:0.30260,MSE:0.09157, MAPE:1.39285, RMSE_inv:1.14615, epoch time:0.20m--\n",
      "EarlyStopping counter: 14 out of 30\n",
      "\n",
      "--------train epoch 43,step 0,loss: 0.26629, RMSE:0.26629,MSE:0.07091, MAE:0.22392, MAPE:0.71239--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 15%|█▍        | 44/300 [00:12<00:51,  5.00it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 43,step 3,loss: 0.31229, RMSE:0.31229,MSE:0.09753, MAE:0.25915, MAPE:0.80393--\n",
      "--------test loss: 0.35496, RMSE:0.35496,MSE:0.12600, MAPE:1.68547, RMSE_inv:1.34447, epoch time:0.20m--\n",
      "EarlyStopping counter: 15 out of 30\n",
      "\n",
      "--------train epoch 44,step 0,loss: 0.28824, RMSE:0.28824,MSE:0.08308, MAE:0.23087, MAPE:0.96966--\n",
      "\n",
      "--------train epoch 44,step 3,loss: 0.39834, RMSE:0.39834,MSE:0.15867, MAE:0.31464, MAPE:0.62043--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 15%|█▌        | 46/300 [00:13<00:49,  5.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.22484, RMSE:0.22484,MSE:0.05055, MAPE:1.01129, RMSE_inv:0.85162, epoch time:0.20m--\n",
      "EarlyStopping counter: 16 out of 30\n",
      "\n",
      "--------train epoch 45,step 0,loss: 0.19135, RMSE:0.19135,MSE:0.03661, MAE:0.15292, MAPE:0.73598--\n",
      "\n",
      "--------train epoch 45,step 3,loss: 0.20834, RMSE:0.20834,MSE:0.04341, MAE:0.17077, MAPE:0.25915--\n",
      "--------test loss: 0.24820, RMSE:0.24820,MSE:0.06160, MAPE:1.23123, RMSE_inv:0.94011, epoch time:0.22m--\n",
      "EarlyStopping counter: 17 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 16%|█▌        | 47/300 [00:13<00:49,  5.14it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 46,step 0,loss: 0.23773, RMSE:0.23773,MSE:0.05652, MAE:0.17445, MAPE:1.31382--\n",
      "\n",
      "--------train epoch 46,step 3,loss: 0.16038, RMSE:0.16038,MSE:0.02572, MAE:0.12887, MAPE:0.27030--\n",
      "Epoch 00047: reducing learning rate of group 0 to 4.0960e-05.\n",
      "--------test loss: 0.21515, RMSE:0.21515,MSE:0.04629, MAPE:0.77307, RMSE_inv:0.81492, epoch time:0.22m--\n",
      "EarlyStopping counter: 18 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 16%|█▌        | 48/300 [00:13<00:51,  4.89it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 47,step 0,loss: 0.17886, RMSE:0.17886,MSE:0.03199, MAE:0.13991, MAPE:0.54284--\n",
      "\n",
      "--------train epoch 47,step 3,loss: 0.15130, RMSE:0.15130,MSE:0.02289, MAE:0.12871, MAPE:0.82485--\n",
      "--------test loss: 0.19152, RMSE:0.19152,MSE:0.03668, MAPE:0.80873, RMSE_inv:0.72542, epoch time:0.22m--\n",
      "EarlyStopping counter: 19 out of 30\n",
      "\n",
      "--------train epoch 48,step 0,loss: 0.16350, RMSE:0.16350,MSE:0.02673, MAE:0.13750, MAPE:0.50211--\n",
      "\n",
      "--------train epoch 48,step 3,loss: 0.09929, RMSE:0.09929,MSE:0.00986, MAE:0.07994, MAPE:0.28894--\n",
      "--------test loss: 0.15039, RMSE:0.15039,MSE:0.02262, MAPE:0.57690, RMSE_inv:0.56963, epoch time:0.22m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 17%|█▋        | 50/300 [00:14<01:39,  2.52it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.188965 --> 0.150390).  Saving model ...\n",
      "\n",
      "--------train epoch 49,step 0,loss: 0.12598, RMSE:0.12598,MSE:0.01587, MAE:0.10058, MAPE:0.42166--\n",
      "\n",
      "--------train epoch 49,step 3,loss: 0.15746, RMSE:0.15746,MSE:0.02479, MAE:0.13007, MAPE:0.33323--\n",
      "--------test loss: 0.22856, RMSE:0.22856,MSE:0.05224, MAPE:1.15612, RMSE_inv:0.86572, epoch time:0.23m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 50,step 0,loss: 0.17959, RMSE:0.17959,MSE:0.03225, MAE:0.13989, MAPE:0.49090--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 17%|█▋        | 51/300 [00:15<01:21,  3.05it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 50,step 3,loss: 0.14083, RMSE:0.14083,MSE:0.01983, MAE:0.12217, MAPE:0.77156--\n",
      "--------test loss: 0.23654, RMSE:0.23654,MSE:0.05595, MAPE:1.00870, RMSE_inv:0.89595, epoch time:0.25m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 51,step 0,loss: 0.19025, RMSE:0.19025,MSE:0.03620, MAE:0.15224, MAPE:0.49718--\n",
      "\n",
      "--------train epoch 51,step 3,loss: 0.16180, RMSE:0.16180,MSE:0.02618, MAE:0.13111, MAPE:0.44142--\n",
      "--------test loss: 0.14176, RMSE:0.14176,MSE:0.02010, MAPE:0.58571, RMSE_inv:0.53693, epoch time:0.25m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 18%|█▊        | 53/300 [00:15<01:23,  2.95it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.150390 --> 0.141758).  Saving model ...\n",
      "\n",
      "--------train epoch 52,step 0,loss: 0.13014, RMSE:0.13014,MSE:0.01694, MAE:0.10601, MAPE:0.28685--\n",
      "\n",
      "--------train epoch 52,step 3,loss: 0.12477, RMSE:0.12477,MSE:0.01557, MAE:0.09011, MAPE:0.99931--\n",
      "--------test loss: 0.14210, RMSE:0.14210,MSE:0.02019, MAPE:0.67930, RMSE_inv:0.53825, epoch time:0.25m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 53,step 0,loss: 0.12421, RMSE:0.12421,MSE:0.01543, MAE:0.09216, MAPE:0.68278--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 18%|█▊        | 54/300 [00:15<01:08,  3.60it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 53,step 3,loss: 0.11280, RMSE:0.11280,MSE:0.01272, MAE:0.10548, MAPE:0.66048--\n",
      "--------test loss: 0.19780, RMSE:0.19780,MSE:0.03913, MAPE:0.81924, RMSE_inv:0.74922, epoch time:0.25m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 54,step 0,loss: 0.13668, RMSE:0.13668,MSE:0.01868, MAE:0.10342, MAPE:0.42920--\n",
      "\n",
      "--------train epoch 54,step 3,loss: 0.12813, RMSE:0.12813,MSE:0.01642, MAE:0.11156, MAPE:0.36225--\n",
      "--------test loss: 0.14167, RMSE:0.14167,MSE:0.02007, MAPE:0.55276, RMSE_inv:0.53662, epoch time:0.27m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 18%|█▊        | 55/300 [00:17<02:12,  1.86it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.141758 --> 0.141675).  Saving model ...\n",
      "\n",
      "--------train epoch 55,step 0,loss: 0.12748, RMSE:0.12748,MSE:0.01625, MAE:0.10358, MAPE:0.44463--\n",
      "\n",
      "--------train epoch 55,step 3,loss: 0.16392, RMSE:0.16392,MSE:0.02687, MAE:0.12044, MAPE:0.43215--\n",
      "--------test loss: 0.14103, RMSE:0.14103,MSE:0.01989, MAPE:0.42275, RMSE_inv:0.53417, epoch time:0.28m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 19%|█▉        | 57/300 [00:17<01:43,  2.35it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.141675 --> 0.141030).  Saving model ...\n",
      "\n",
      "--------train epoch 56,step 0,loss: 0.11830, RMSE:0.11830,MSE:0.01400, MAE:0.09478, MAPE:0.27678--\n",
      "\n",
      "--------train epoch 56,step 3,loss: 0.09885, RMSE:0.09885,MSE:0.00977, MAE:0.07569, MAPE:0.45710--\n",
      "--------test loss: 0.16178, RMSE:0.16178,MSE:0.02617, MAPE:0.67388, RMSE_inv:0.61276, epoch time:0.28m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 57,step 0,loss: 0.14031, RMSE:0.14031,MSE:0.01969, MAE:0.11265, MAPE:0.40970--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 20%|█▉        | 59/300 [00:18<01:05,  3.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 57,step 3,loss: 0.16033, RMSE:0.16033,MSE:0.02570, MAE:0.11673, MAPE:0.15970--\n",
      "--------test loss: 0.19096, RMSE:0.19096,MSE:0.03647, MAPE:1.00346, RMSE_inv:0.72331, epoch time:0.28m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 58,step 0,loss: 0.19726, RMSE:0.19726,MSE:0.03891, MAE:0.16025, MAPE:0.70392--\n",
      "\n",
      "--------train epoch 58,step 3,loss: 0.11443, RMSE:0.11443,MSE:0.01309, MAE:0.08869, MAPE:0.32841--\n",
      "--------test loss: 0.31989, RMSE:0.31989,MSE:0.10233, MAPE:1.01086, RMSE_inv:1.21165, epoch time:0.30m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 59,step 0,loss: 0.31257, RMSE:0.31257,MSE:0.09770, MAE:0.27765, MAPE:1.03454--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 20%|██        | 61/300 [00:18<00:53,  4.49it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 59,step 3,loss: 0.21834, RMSE:0.21834,MSE:0.04767, MAE:0.18601, MAPE:1.54706--\n",
      "--------test loss: 0.24279, RMSE:0.24279,MSE:0.05895, MAPE:0.91877, RMSE_inv:0.91962, epoch time:0.30m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 60,step 0,loss: 0.21884, RMSE:0.21884,MSE:0.04789, MAE:0.17874, MAPE:0.87390--\n",
      "\n",
      "--------train epoch 60,step 3,loss: 0.14497, RMSE:0.14497,MSE:0.02102, MAE:0.11076, MAPE:0.60950--\n",
      "--------test loss: 0.16474, RMSE:0.16474,MSE:0.02714, MAPE:0.74636, RMSE_inv:0.62396, epoch time:0.30m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 61,step 0,loss: 0.17806, RMSE:0.17806,MSE:0.03171, MAE:0.14137, MAPE:0.51570--\n",
      "\n",
      "--------train epoch 61,step 3,loss: 0.16014, RMSE:0.16014,MSE:0.02565, MAE:0.12779, MAPE:0.38552--\n",
      "--------test loss: 0.11287, RMSE:0.11287,MSE:0.01274, MAPE:0.52143, RMSE_inv:0.42751, epoch time:0.30m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 21%|██        | 62/300 [00:18<01:14,  3.18it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.141030 --> 0.112868).  Saving model ...\n",
      "\n",
      "--------train epoch 62,step 0,loss: 0.10536, RMSE:0.10536,MSE:0.01110, MAE:0.08542, MAPE:0.35428--\n",
      "\n",
      "--------train epoch 62,step 3,loss: 0.10405, RMSE:0.10405,MSE:0.01083, MAE:0.07542, MAPE:0.12404--\n",
      "--------test loss: 0.11033, RMSE:0.11033,MSE:0.01217, MAPE:0.30198, RMSE_inv:0.41788, epoch time:0.32m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 21%|██        | 63/300 [00:19<01:39,  2.38it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.112868 --> 0.110327).  Saving model ...\n",
      "\n",
      "--------train epoch 63,step 0,loss: 0.10665, RMSE:0.10665,MSE:0.01137, MAE:0.08478, MAPE:0.48378--\n",
      "\n",
      "--------train epoch 63,step 3,loss: 0.08289, RMSE:0.08289,MSE:0.00687, MAE:0.06618, MAPE:0.08765--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 21%|██▏       | 64/300 [00:19<01:25,  2.76it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.13052, RMSE:0.13052,MSE:0.01704, MAPE:0.51713, RMSE_inv:0.49438, epoch time:0.32m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 64,step 0,loss: 0.12415, RMSE:0.12415,MSE:0.01541, MAE:0.09053, MAPE:0.31383--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 22%|██▏       | 66/300 [00:20<01:02,  3.74it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 64,step 3,loss: 0.07864, RMSE:0.07864,MSE:0.00618, MAE:0.06273, MAPE:0.18744--\n",
      "--------test loss: 0.12654, RMSE:0.12654,MSE:0.01601, MAPE:0.47215, RMSE_inv:0.47928, epoch time:0.33m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 65,step 0,loss: 0.11142, RMSE:0.11142,MSE:0.01242, MAE:0.09120, MAPE:0.41197--\n",
      "\n",
      "--------train epoch 65,step 3,loss: 0.09675, RMSE:0.09675,MSE:0.00936, MAE:0.08586, MAPE:0.25441--\n",
      "--------test loss: 0.13010, RMSE:0.13010,MSE:0.01693, MAPE:0.52174, RMSE_inv:0.49277, epoch time:0.33m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 66,step 0,loss: 0.10565, RMSE:0.10565,MSE:0.01116, MAE:0.08559, MAPE:0.51227--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 23%|██▎       | 68/300 [00:20<00:46,  5.04it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 66,step 3,loss: 0.13694, RMSE:0.13694,MSE:0.01875, MAE:0.11579, MAPE:0.46692--\n",
      "--------test loss: 0.12426, RMSE:0.12426,MSE:0.01544, MAPE:0.52711, RMSE_inv:0.47064, epoch time:0.33m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 67,step 0,loss: 0.11562, RMSE:0.11562,MSE:0.01337, MAE:0.09096, MAPE:0.44472--\n",
      "\n",
      "--------train epoch 67,step 3,loss: 0.11384, RMSE:0.11384,MSE:0.01296, MAE:0.09051, MAPE:0.11411--\n",
      "--------test loss: 0.16749, RMSE:0.16749,MSE:0.02805, MAPE:0.50509, RMSE_inv:0.63441, epoch time:0.33m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 68,step 0,loss: 0.17632, RMSE:0.17632,MSE:0.03109, MAE:0.13673, MAPE:0.35719--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 23%|██▎       | 70/300 [00:20<00:36,  6.22it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 68,step 3,loss: 0.14270, RMSE:0.14270,MSE:0.02036, MAE:0.11320, MAPE:0.53598--\n",
      "Epoch 00069: reducing learning rate of group 0 to 3.2768e-05.\n",
      "--------test loss: 0.20585, RMSE:0.20585,MSE:0.04237, MAPE:1.15638, RMSE_inv:0.77968, epoch time:0.33m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 69,step 0,loss: 0.18244, RMSE:0.18244,MSE:0.03328, MAE:0.15022, MAPE:0.53888--\n",
      "\n",
      "--------train epoch 69,step 3,loss: 0.15927, RMSE:0.15927,MSE:0.02537, MAE:0.11994, MAPE:0.20076--\n",
      "--------test loss: 0.17303, RMSE:0.17303,MSE:0.02994, MAPE:0.71037, RMSE_inv:0.65537, epoch time:0.33m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 70,step 0,loss: 0.16482, RMSE:0.16482,MSE:0.02717, MAE:0.13917, MAPE:0.63624--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 24%|██▎       | 71/300 [00:20<00:39,  5.77it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 70,step 3,loss: 0.11022, RMSE:0.11022,MSE:0.01215, MAE:0.09261, MAPE:0.58773--\n",
      "--------test loss: 0.12009, RMSE:0.12009,MSE:0.01442, MAPE:0.58268, RMSE_inv:0.45487, epoch time:0.33m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 71,step 0,loss: 0.10003, RMSE:0.10003,MSE:0.01001, MAE:0.07929, MAPE:0.46876--\n",
      "\n",
      "--------train epoch 71,step 3,loss: 0.06570, RMSE:0.06570,MSE:0.00432, MAE:0.05285, MAPE:0.21780--\n",
      "--------test loss: 0.15878, RMSE:0.15878,MSE:0.02521, MAPE:0.69408, RMSE_inv:0.60140, epoch time:0.35m--\n",
      "EarlyStopping counter: 9 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 24%|██▍       | 73/300 [00:21<00:35,  6.44it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 72,step 0,loss: 0.12504, RMSE:0.12504,MSE:0.01563, MAE:0.09539, MAPE:0.46282--\n",
      "\n",
      "--------train epoch 72,step 3,loss: 0.11570, RMSE:0.11570,MSE:0.01339, MAE:0.08458, MAPE:0.09103--\n",
      "--------test loss: 0.16514, RMSE:0.16514,MSE:0.02727, MAPE:0.74286, RMSE_inv:0.62550, epoch time:0.35m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 73,step 0,loss: 0.14775, RMSE:0.14775,MSE:0.02183, MAE:0.11707, MAPE:0.83455--\n",
      "\n",
      "--------train epoch 73,step 3,loss: 0.16653, RMSE:0.16653,MSE:0.02773, MAE:0.11911, MAPE:0.19449--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 25%|██▌       | 75/300 [00:21<00:33,  6.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.14012, RMSE:0.14012,MSE:0.01963, MAPE:0.50660, RMSE_inv:0.53073, epoch time:0.35m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 74,step 0,loss: 0.12342, RMSE:0.12342,MSE:0.01523, MAE:0.10348, MAPE:0.32169--\n",
      "\n",
      "--------train epoch 74,step 3,loss: 0.10946, RMSE:0.10946,MSE:0.01198, MAE:0.08497, MAPE:0.14126--\n",
      "Epoch 00075: reducing learning rate of group 0 to 2.6214e-05.\n",
      "--------test loss: 0.12917, RMSE:0.12917,MSE:0.01668, MAPE:0.70857, RMSE_inv:0.48924, epoch time:0.35m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 75,step 0,loss: 0.12039, RMSE:0.12039,MSE:0.01449, MAE:0.10165, MAPE:0.43290--\n",
      "\n",
      "--------train epoch 75,step 3,loss: 0.11965, RMSE:0.11965,MSE:0.01432, MAE:0.09170, MAPE:0.19948--\n",
      "--------test loss: 0.10297, RMSE:0.10297,MSE:0.01060, MAPE:0.32000, RMSE_inv:0.39000, epoch time:0.35m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|██▌       | 77/300 [00:22<00:56,  3.94it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.110327 --> 0.102965).  Saving model ...\n",
      "\n",
      "--------train epoch 76,step 0,loss: 0.09975, RMSE:0.09975,MSE:0.00995, MAE:0.07275, MAPE:0.29969--\n",
      "\n",
      "--------train epoch 76,step 3,loss: 0.11013, RMSE:0.11013,MSE:0.01213, MAE:0.09856, MAPE:0.15935--\n",
      "--------test loss: 0.14664, RMSE:0.14664,MSE:0.02150, MAPE:0.69946, RMSE_inv:0.55542, epoch time:0.37m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 77,step 0,loss: 0.12514, RMSE:0.12514,MSE:0.01566, MAE:0.10051, MAPE:0.28334--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|██▌       | 78/300 [00:22<00:48,  4.57it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 77,step 3,loss: 0.09000, RMSE:0.09000,MSE:0.00810, MAE:0.07150, MAPE:0.11621--\n",
      "--------test loss: 0.11746, RMSE:0.11746,MSE:0.01380, MAPE:0.50262, RMSE_inv:0.44489, epoch time:0.37m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 78,step 0,loss: 0.10101, RMSE:0.10101,MSE:0.01020, MAE:0.07865, MAPE:0.27389--\n",
      "\n",
      "--------train epoch 78,step 3,loss: 0.12190, RMSE:0.12190,MSE:0.01486, MAE:0.08600, MAPE:0.13645--\n",
      "--------test loss: 0.10273, RMSE:0.10273,MSE:0.01055, MAPE:0.56014, RMSE_inv:0.38910, epoch time:0.37m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 26%|██▋       | 79/300 [00:22<01:09,  3.20it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.102965 --> 0.102728).  Saving model ...\n",
      "\n",
      "--------train epoch 79,step 0,loss: 0.08661, RMSE:0.08661,MSE:0.00750, MAE:0.06658, MAPE:0.33867--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 27%|██▋       | 80/300 [00:23<01:04,  3.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 79,step 3,loss: 0.07103, RMSE:0.07103,MSE:0.00505, MAE:0.05148, MAPE:0.17277--\n",
      "--------test loss: 0.13329, RMSE:0.13329,MSE:0.01777, MAPE:0.36894, RMSE_inv:0.50486, epoch time:0.38m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 80,step 0,loss: 0.10790, RMSE:0.10790,MSE:0.01164, MAE:0.08286, MAPE:0.29644--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 27%|██▋       | 81/300 [00:23<01:00,  3.61it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 80,step 3,loss: 0.09752, RMSE:0.09752,MSE:0.00951, MAE:0.07536, MAPE:0.16225--\n",
      "--------test loss: 0.11813, RMSE:0.11813,MSE:0.01395, MAPE:0.31047, RMSE_inv:0.44744, epoch time:0.38m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 81,step 0,loss: 0.11234, RMSE:0.11234,MSE:0.01262, MAE:0.09266, MAPE:0.39495--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 27%|██▋       | 82/300 [00:23<00:58,  3.75it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 81,step 3,loss: 0.07303, RMSE:0.07303,MSE:0.00533, MAE:0.05859, MAPE:0.13440--\n",
      "--------test loss: 0.11994, RMSE:0.11994,MSE:0.01438, MAPE:0.45810, RMSE_inv:0.45428, epoch time:0.38m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 82,step 0,loss: 0.12848, RMSE:0.12848,MSE:0.01651, MAE:0.11393, MAPE:0.40441--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 28%|██▊       | 83/300 [00:23<00:56,  3.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 82,step 3,loss: 0.12011, RMSE:0.12011,MSE:0.01443, MAE:0.09879, MAPE:0.18081--\n",
      "--------test loss: 0.12369, RMSE:0.12369,MSE:0.01530, MAPE:0.43496, RMSE_inv:0.46848, epoch time:0.38m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 83,step 0,loss: 0.12232, RMSE:0.12232,MSE:0.01496, MAE:0.09927, MAPE:0.24517--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 28%|██▊       | 84/300 [00:24<00:55,  3.86it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 83,step 3,loss: 0.10689, RMSE:0.10689,MSE:0.01143, MAE:0.09093, MAPE:0.20056--\n",
      "--------test loss: 0.11489, RMSE:0.11489,MSE:0.01320, MAPE:0.37059, RMSE_inv:0.43516, epoch time:0.40m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 84,step 0,loss: 0.09187, RMSE:0.09187,MSE:0.00844, MAE:0.07483, MAPE:0.32681--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 29%|██▊       | 86/300 [00:24<00:47,  4.48it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 84,step 3,loss: 0.06742, RMSE:0.06742,MSE:0.00455, MAE:0.05417, MAPE:0.19911--\n",
      "Epoch 00085: reducing learning rate of group 0 to 2.0972e-05.\n",
      "--------test loss: 0.16433, RMSE:0.16433,MSE:0.02700, MAPE:0.63719, RMSE_inv:0.62242, epoch time:0.40m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 85,step 0,loss: 0.12464, RMSE:0.12464,MSE:0.01553, MAE:0.10029, MAPE:0.39260--\n",
      "\n",
      "--------train epoch 85,step 3,loss: 0.10668, RMSE:0.10668,MSE:0.01138, MAE:0.09191, MAPE:0.41258--\n",
      "--------test loss: 0.11411, RMSE:0.11411,MSE:0.01302, MAPE:0.35983, RMSE_inv:0.43223, epoch time:0.40m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 86,step 0,loss: 0.10926, RMSE:0.10926,MSE:0.01194, MAE:0.08696, MAPE:0.34644--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 29%|██▉       | 88/300 [00:24<00:37,  5.67it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 86,step 3,loss: 0.09738, RMSE:0.09738,MSE:0.00948, MAE:0.07893, MAPE:0.15256--\n",
      "--------test loss: 0.11890, RMSE:0.11890,MSE:0.01414, MAPE:0.48343, RMSE_inv:0.45037, epoch time:0.40m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 87,step 0,loss: 0.12802, RMSE:0.12802,MSE:0.01639, MAE:0.09970, MAPE:0.20680--\n",
      "\n",
      "--------train epoch 87,step 3,loss: 0.10140, RMSE:0.10140,MSE:0.01028, MAE:0.06786, MAPE:0.10547--\n",
      "--------test loss: 0.10750, RMSE:0.10750,MSE:0.01156, MAPE:0.34925, RMSE_inv:0.40718, epoch time:0.40m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 88,step 0,loss: 0.11155, RMSE:0.11155,MSE:0.01244, MAE:0.09377, MAPE:0.25052--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 30%|███       | 90/300 [00:25<00:33,  6.18it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 88,step 3,loss: 0.07302, RMSE:0.07302,MSE:0.00533, MAE:0.05795, MAPE:0.53583--\n",
      "--------test loss: 0.14526, RMSE:0.14526,MSE:0.02110, MAPE:0.89287, RMSE_inv:0.55019, epoch time:0.42m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 89,step 0,loss: 0.11494, RMSE:0.11494,MSE:0.01321, MAE:0.08266, MAPE:0.37037--\n",
      "\n",
      "--------train epoch 89,step 3,loss: 0.03917, RMSE:0.03917,MSE:0.00153, MAE:0.03516, MAPE:0.13285--\n",
      "--------test loss: 0.19924, RMSE:0.19924,MSE:0.03970, MAPE:1.08217, RMSE_inv:0.75466, epoch time:0.42m--\n",
      "EarlyStopping counter: 11 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 30%|███       | 91/300 [00:25<00:37,  5.61it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 90,step 0,loss: 0.15893, RMSE:0.15893,MSE:0.02526, MAE:0.11697, MAPE:0.34315--\n",
      "\n",
      "--------train epoch 90,step 3,loss: 0.10036, RMSE:0.10036,MSE:0.01007, MAE:0.08539, MAPE:0.31222--\n",
      "Epoch 00091: reducing learning rate of group 0 to 1.6777e-05.\n",
      "--------test loss: 0.15205, RMSE:0.15205,MSE:0.02312, MAPE:0.71297, RMSE_inv:0.57593, epoch time:0.42m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 91,step 0,loss: 0.14505, RMSE:0.14505,MSE:0.02104, MAE:0.11035, MAPE:0.63986--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 31%|███       | 92/300 [00:25<00:33,  6.21it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 91,step 3,loss: 0.06908, RMSE:0.06908,MSE:0.00477, MAE:0.05623, MAPE:0.32993--\n",
      "--------test loss: 0.11649, RMSE:0.11649,MSE:0.01357, MAPE:0.41209, RMSE_inv:0.44122, epoch time:0.42m--\n",
      "EarlyStopping counter: 13 out of 30\n",
      "\n",
      "--------train epoch 92,step 0,loss: 0.11358, RMSE:0.11358,MSE:0.01290, MAE:0.09226, MAPE:0.41668--\n",
      "\n",
      "--------train epoch 92,step 3,loss: 0.07189, RMSE:0.07189,MSE:0.00517, MAE:0.05662, MAPE:0.11881--\n",
      "--------test loss: 0.10043, RMSE:0.10043,MSE:0.01009, MAPE:0.63075, RMSE_inv:0.38041, epoch time:0.42m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 31%|███▏      | 94/300 [00:26<00:43,  4.76it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.102728 --> 0.100434).  Saving model ...\n",
      "\n",
      "--------train epoch 93,step 0,loss: 0.08913, RMSE:0.08913,MSE:0.00794, MAE:0.07081, MAPE:0.39247--\n",
      "\n",
      "--------train epoch 93,step 3,loss: 0.07077, RMSE:0.07077,MSE:0.00501, MAE:0.06172, MAPE:0.40310--\n",
      "--------test loss: 0.12560, RMSE:0.12560,MSE:0.01578, MAPE:0.45124, RMSE_inv:0.47574, epoch time:0.43m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 94,step 0,loss: 0.10772, RMSE:0.10772,MSE:0.01160, MAE:0.08200, MAPE:0.23300--\n",
      "\n",
      "--------train epoch 94,step 3,loss: 0.05863, RMSE:0.05863,MSE:0.00344, MAE:0.04828, MAPE:0.24728--\n",
      "--------test loss: 0.09463, RMSE:0.09463,MSE:0.00895, MAPE:0.30972, RMSE_inv:0.35842, epoch time:0.43m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 32%|███▏      | 95/300 [00:26<01:23,  2.47it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.100434 --> 0.094627).  Saving model ...\n",
      "\n",
      "--------train epoch 95,step 0,loss: 0.09910, RMSE:0.09910,MSE:0.00982, MAE:0.07636, MAPE:0.27041--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 32%|███▏      | 96/300 [00:27<01:12,  2.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 95,step 3,loss: 0.06924, RMSE:0.06924,MSE:0.00479, MAE:0.05777, MAPE:0.19741--\n",
      "--------test loss: 0.10845, RMSE:0.10845,MSE:0.01176, MAPE:0.30420, RMSE_inv:0.41076, epoch time:0.45m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 96,step 0,loss: 0.09146, RMSE:0.09146,MSE:0.00837, MAE:0.07467, MAPE:0.33834--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 32%|███▏      | 97/300 [00:27<01:05,  3.11it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 96,step 3,loss: 0.08190, RMSE:0.08190,MSE:0.00671, MAE:0.06336, MAPE:0.22375--\n",
      "--------test loss: 0.12536, RMSE:0.12536,MSE:0.01571, MAPE:0.36898, RMSE_inv:0.47481, epoch time:0.45m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 97,step 0,loss: 0.13385, RMSE:0.13385,MSE:0.01791, MAE:0.11473, MAPE:0.33054--\n",
      "\n",
      "--------train epoch 97,step 3,loss: 0.06807, RMSE:0.06807,MSE:0.00463, MAE:0.05958, MAPE:0.14596--\n",
      "--------test loss: 0.07813, RMSE:0.07813,MSE:0.00610, MAPE:0.26459, RMSE_inv:0.29591, epoch time:0.45m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 33%|███▎      | 98/300 [00:28<01:31,  2.21it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.094627 --> 0.078125).  Saving model ...\n",
      "\n",
      "--------train epoch 98,step 0,loss: 0.06993, RMSE:0.06993,MSE:0.00489, MAE:0.05576, MAPE:0.19135--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 33%|███▎      | 99/300 [00:28<01:18,  2.57it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 98,step 3,loss: 0.06694, RMSE:0.06694,MSE:0.00448, MAE:0.05955, MAPE:0.09297--\n",
      "--------test loss: 0.10161, RMSE:0.10161,MSE:0.01032, MAPE:0.50466, RMSE_inv:0.38486, epoch time:0.47m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 99,step 0,loss: 0.07984, RMSE:0.07984,MSE:0.00637, MAE:0.06480, MAPE:0.27930--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 33%|███▎      | 100/300 [00:28<01:08,  2.91it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 99,step 3,loss: 0.09686, RMSE:0.09686,MSE:0.00938, MAE:0.07773, MAPE:0.20440--\n",
      "--------test loss: 0.09209, RMSE:0.09209,MSE:0.00848, MAPE:0.45074, RMSE_inv:0.34881, epoch time:0.47m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 100,step 0,loss: 0.07681, RMSE:0.07681,MSE:0.00590, MAE:0.06512, MAPE:0.26507--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 34%|███▎      | 101/300 [00:28<01:03,  3.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 100,step 3,loss: 0.08367, RMSE:0.08367,MSE:0.00700, MAE:0.07435, MAPE:0.24180--\n",
      "--------test loss: 0.11521, RMSE:0.11521,MSE:0.01327, MAPE:0.56933, RMSE_inv:0.43637, epoch time:0.47m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 101,step 0,loss: 0.09551, RMSE:0.09551,MSE:0.00912, MAE:0.07398, MAPE:0.26084--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 34%|███▍      | 102/300 [00:29<00:59,  3.32it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 101,step 3,loss: 0.12956, RMSE:0.12956,MSE:0.01679, MAE:0.11595, MAPE:0.47585--\n",
      "--------test loss: 0.07862, RMSE:0.07862,MSE:0.00618, MAPE:0.30427, RMSE_inv:0.29780, epoch time:0.48m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 102,step 0,loss: 0.06360, RMSE:0.06360,MSE:0.00404, MAE:0.05178, MAPE:0.27162--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 34%|███▍      | 103/300 [00:29<00:55,  3.52it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 102,step 3,loss: 0.06600, RMSE:0.06600,MSE:0.00436, MAE:0.05441, MAPE:0.19838--\n",
      "--------test loss: 0.08841, RMSE:0.08841,MSE:0.00782, MAPE:0.33916, RMSE_inv:0.33487, epoch time:0.48m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 103,step 0,loss: 0.06830, RMSE:0.06830,MSE:0.00466, MAE:0.05153, MAPE:0.23036--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▍      | 104/300 [00:29<00:52,  3.74it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 103,step 3,loss: 0.06680, RMSE:0.06680,MSE:0.00446, MAE:0.05448, MAPE:0.13743--\n",
      "Epoch 00104: reducing learning rate of group 0 to 1.3422e-05.\n",
      "--------test loss: 0.09754, RMSE:0.09754,MSE:0.00951, MAPE:0.41125, RMSE_inv:0.36947, epoch time:0.48m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 104,step 0,loss: 0.07546, RMSE:0.07546,MSE:0.00569, MAE:0.06092, MAPE:0.18251--\n",
      "\n",
      "--------train epoch 104,step 3,loss: 0.06211, RMSE:0.06211,MSE:0.00386, MAE:0.05292, MAPE:0.11860--\n",
      "--------test loss: 0.07035, RMSE:0.07035,MSE:0.00495, MAPE:0.22203, RMSE_inv:0.26645, epoch time:0.48m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▌      | 105/300 [00:30<01:15,  2.58it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.078125 --> 0.070347).  Saving model ...\n",
      "\n",
      "--------train epoch 105,step 0,loss: 0.05791, RMSE:0.05791,MSE:0.00335, MAE:0.04567, MAPE:0.14709--\n",
      "\n",
      "--------train epoch 105,step 3,loss: 0.09736, RMSE:0.09736,MSE:0.00948, MAE:0.07388, MAPE:0.32429--\n",
      "--------test loss: 0.06885, RMSE:0.06885,MSE:0.00474, MAPE:0.30050, RMSE_inv:0.26079, epoch time:0.50m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 36%|███▌      | 107/300 [00:31<01:07,  2.86it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.070347 --> 0.068852).  Saving model ...\n",
      "\n",
      "--------train epoch 106,step 0,loss: 0.05754, RMSE:0.05754,MSE:0.00331, MAE:0.04365, MAPE:0.21279--\n",
      "\n",
      "--------train epoch 106,step 3,loss: 0.05012, RMSE:0.05012,MSE:0.00251, MAE:0.03922, MAPE:0.16671--\n",
      "--------test loss: 0.08512, RMSE:0.08512,MSE:0.00725, MAPE:0.27006, RMSE_inv:0.32242, epoch time:0.52m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 107,step 0,loss: 0.06706, RMSE:0.06706,MSE:0.00450, MAE:0.05366, MAPE:0.25248--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 36%|███▋      | 109/300 [00:31<00:48,  3.95it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 107,step 3,loss: 0.05751, RMSE:0.05751,MSE:0.00331, MAE:0.04275, MAPE:0.04982--\n",
      "--------test loss: 0.07916, RMSE:0.07916,MSE:0.00627, MAPE:0.23438, RMSE_inv:0.29983, epoch time:0.52m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 108,step 0,loss: 0.06478, RMSE:0.06478,MSE:0.00420, MAE:0.05231, MAPE:0.19283--\n",
      "\n",
      "--------train epoch 108,step 3,loss: 0.05522, RMSE:0.05522,MSE:0.00305, MAE:0.04523, MAPE:0.16250--\n",
      "--------test loss: 0.08234, RMSE:0.08234,MSE:0.00678, MAPE:0.24249, RMSE_inv:0.31187, epoch time:0.52m--\n",
      "EarlyStopping counter: 3 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 37%|███▋      | 110/300 [00:31<00:47,  3.98it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 109,step 0,loss: 0.06624, RMSE:0.06624,MSE:0.00439, MAE:0.05539, MAPE:0.21013--\n",
      "\n",
      "--------train epoch 109,step 3,loss: 0.04368, RMSE:0.04368,MSE:0.00191, MAE:0.03199, MAPE:0.11417--\n",
      "--------test loss: 0.07035, RMSE:0.07035,MSE:0.00495, MAPE:0.17309, RMSE_inv:0.26646, epoch time:0.52m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 110,step 0,loss: 0.06593, RMSE:0.06593,MSE:0.00435, MAE:0.05008, MAPE:0.15580--\n",
      "\n",
      "--------train epoch 110,step 3,loss: 0.08534, RMSE:0.08534,MSE:0.00728, MAE:0.06705, MAPE:0.23640--\n",
      "--------test loss: 0.06926, RMSE:0.06926,MSE:0.00480, MAPE:0.16618, RMSE_inv:0.26234, epoch time:0.52m--\n",
      "EarlyStopping counter: 5 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 37%|███▋      | 112/300 [00:32<00:45,  4.11it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 111,step 0,loss: 0.05387, RMSE:0.05387,MSE:0.00290, MAE:0.04065, MAPE:0.22764--\n",
      "\n",
      "--------train epoch 111,step 3,loss: 0.08903, RMSE:0.08903,MSE:0.00793, MAE:0.06920, MAPE:0.11265--\n",
      "Epoch 00112: reducing learning rate of group 0 to 1.0737e-05.\n",
      "--------test loss: 0.07108, RMSE:0.07108,MSE:0.00505, MAPE:0.35340, RMSE_inv:0.26923, epoch time:0.53m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 112,step 0,loss: 0.04799, RMSE:0.04799,MSE:0.00230, MAE:0.03840, MAPE:0.14805--\n",
      "\n",
      "--------train epoch 112,step 3,loss: 0.05014, RMSE:0.05014,MSE:0.00251, MAE:0.03769, MAPE:0.36666--\n",
      "--------test loss: 0.06585, RMSE:0.06585,MSE:0.00434, MAPE:0.24546, RMSE_inv:0.24942, epoch time:0.53m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 38%|███▊      | 113/300 [00:33<01:38,  1.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.068852 --> 0.065850).  Saving model ...\n",
      "\n",
      "--------train epoch 113,step 0,loss: 0.05505, RMSE:0.05505,MSE:0.00303, MAE:0.04423, MAPE:0.18262--\n",
      "\n",
      "--------train epoch 113,step 3,loss: 0.03719, RMSE:0.03719,MSE:0.00138, MAE:0.03014, MAPE:0.09219--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 38%|███▊      | 115/300 [00:33<01:05,  2.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.07902, RMSE:0.07902,MSE:0.00624, MAPE:0.35147, RMSE_inv:0.29928, epoch time:0.55m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 114,step 0,loss: 0.05354, RMSE:0.05354,MSE:0.00287, MAE:0.04168, MAPE:0.11851--\n",
      "\n",
      "--------train epoch 114,step 3,loss: 0.04304, RMSE:0.04304,MSE:0.00185, MAE:0.03677, MAPE:0.07611--\n",
      "--------test loss: 0.06619, RMSE:0.06619,MSE:0.00438, MAPE:0.24974, RMSE_inv:0.25069, epoch time:0.55m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 115,step 0,loss: 0.05574, RMSE:0.05574,MSE:0.00311, MAE:0.04292, MAPE:0.10469--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 39%|███▉      | 117/300 [00:33<00:42,  4.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 115,step 3,loss: 0.05175, RMSE:0.05175,MSE:0.00268, MAE:0.04558, MAPE:0.10699--\n",
      "--------test loss: 0.09206, RMSE:0.09206,MSE:0.00848, MAPE:0.35554, RMSE_inv:0.34871, epoch time:0.55m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 116,step 0,loss: 0.05911, RMSE:0.05911,MSE:0.00349, MAE:0.04675, MAPE:0.19646--\n",
      "\n",
      "--------train epoch 116,step 3,loss: 0.04996, RMSE:0.04996,MSE:0.00250, MAE:0.04227, MAPE:0.12688--\n",
      "--------test loss: 0.07960, RMSE:0.07960,MSE:0.00634, MAPE:0.35619, RMSE_inv:0.30150, epoch time:0.55m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 117,step 0,loss: 0.07086, RMSE:0.07086,MSE:0.00502, MAE:0.06118, MAPE:0.29684--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 39%|███▉      | 118/300 [00:34<00:41,  4.36it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 117,step 3,loss: 0.07205, RMSE:0.07205,MSE:0.00519, MAE:0.06503, MAPE:0.13522--\n",
      "--------test loss: 0.06845, RMSE:0.06845,MSE:0.00468, MAPE:0.22805, RMSE_inv:0.25925, epoch time:0.57m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 118,step 0,loss: 0.05950, RMSE:0.05950,MSE:0.00354, MAE:0.05014, MAPE:0.25983--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 40%|███▉      | 119/300 [00:34<00:41,  4.34it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 118,step 3,loss: 0.04433, RMSE:0.04433,MSE:0.00197, MAE:0.03444, MAPE:0.42742--\n",
      "Epoch 00119: reducing learning rate of group 0 to 8.5899e-06.\n",
      "--------test loss: 0.09622, RMSE:0.09622,MSE:0.00926, MAPE:0.38293, RMSE_inv:0.36443, epoch time:0.57m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 119,step 0,loss: 0.07195, RMSE:0.07195,MSE:0.00518, MAE:0.05695, MAPE:0.24747--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 40%|████      | 120/300 [00:34<00:41,  4.33it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 119,step 3,loss: 0.05883, RMSE:0.05883,MSE:0.00346, MAE:0.04898, MAPE:0.11103--\n",
      "--------test loss: 0.11389, RMSE:0.11389,MSE:0.01297, MAPE:0.42938, RMSE_inv:0.43138, epoch time:0.57m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 120,step 0,loss: 0.08765, RMSE:0.08765,MSE:0.00768, MAE:0.07045, MAPE:0.20805--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 40%|████      | 121/300 [00:34<00:41,  4.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 120,step 3,loss: 0.06574, RMSE:0.06574,MSE:0.00432, MAE:0.05428, MAPE:0.74610--\n",
      "--------test loss: 0.08327, RMSE:0.08327,MSE:0.00693, MAPE:0.21223, RMSE_inv:0.31540, epoch time:0.57m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 121,step 0,loss: 0.07450, RMSE:0.07450,MSE:0.00555, MAE:0.05532, MAPE:0.17720--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 41%|████      | 122/300 [00:35<00:42,  4.24it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 121,step 3,loss: 0.04517, RMSE:0.04517,MSE:0.00204, MAE:0.04024, MAPE:0.07442--\n",
      "--------test loss: 0.07933, RMSE:0.07933,MSE:0.00629, MAPE:0.26978, RMSE_inv:0.30049, epoch time:0.58m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 122,step 0,loss: 0.07084, RMSE:0.07084,MSE:0.00502, MAE:0.05740, MAPE:0.19923--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 41%|████      | 123/300 [00:35<00:42,  4.21it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 122,step 3,loss: 0.04573, RMSE:0.04573,MSE:0.00209, MAE:0.03577, MAPE:0.22885--\n",
      "--------test loss: 0.09669, RMSE:0.09669,MSE:0.00935, MAPE:0.48780, RMSE_inv:0.36624, epoch time:0.58m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 123,step 0,loss: 0.08199, RMSE:0.08199,MSE:0.00672, MAE:0.06934, MAPE:0.31036--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 41%|████▏     | 124/300 [00:35<00:41,  4.24it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 123,step 3,loss: 0.08006, RMSE:0.08006,MSE:0.00641, MAE:0.07389, MAPE:0.17712--\n",
      "--------test loss: 0.06704, RMSE:0.06704,MSE:0.00449, MAPE:0.22171, RMSE_inv:0.25393, epoch time:0.58m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 124,step 0,loss: 0.04915, RMSE:0.04915,MSE:0.00242, MAE:0.04169, MAPE:0.19325--\n",
      "\n",
      "--------train epoch 124,step 3,loss: 0.05760, RMSE:0.05760,MSE:0.00332, MAE:0.04514, MAPE:0.05657--\n",
      "--------test loss: 0.05972, RMSE:0.05972,MSE:0.00357, MAPE:0.19023, RMSE_inv:0.22620, epoch time:0.58m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 42%|████▏     | 126/300 [00:36<00:49,  3.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.065850 --> 0.059719).  Saving model ...\n",
      "\n",
      "--------train epoch 125,step 0,loss: 0.04316, RMSE:0.04316,MSE:0.00186, MAE:0.03392, MAPE:0.09146--\n",
      "\n",
      "--------train epoch 125,step 3,loss: 0.05081, RMSE:0.05081,MSE:0.00258, MAE:0.04189, MAPE:0.10918--\n",
      "--------test loss: 0.07397, RMSE:0.07397,MSE:0.00547, MAPE:0.31739, RMSE_inv:0.28019, epoch time:0.60m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 126,step 0,loss: 0.04738, RMSE:0.04738,MSE:0.00224, MAE:0.03506, MAPE:0.10513--\n",
      "\n",
      "--------train epoch 126,step 3,loss: 0.04555, RMSE:0.04555,MSE:0.00207, MAE:0.03548, MAPE:0.03427--\n",
      "--------test loss: 0.05487, RMSE:0.05487,MSE:0.00301, MAPE:0.17216, RMSE_inv:0.20782, epoch time:0.60m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 42%|████▏     | 127/300 [00:36<01:08,  2.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.059719 --> 0.054868).  Saving model ...\n",
      "\n",
      "--------train epoch 127,step 0,loss: 0.04260, RMSE:0.04260,MSE:0.00181, MAE:0.03316, MAPE:0.08516--\n",
      "\n",
      "--------train epoch 127,step 3,loss: 0.03143, RMSE:0.03143,MSE:0.00099, MAE:0.02644, MAPE:0.10985--\n",
      "--------test loss: 0.05389, RMSE:0.05389,MSE:0.00290, MAPE:0.18441, RMSE_inv:0.20412, epoch time:0.62m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 43%|████▎     | 128/300 [00:37<01:15,  2.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.054868 --> 0.053892).  Saving model ...\n",
      "\n",
      "--------train epoch 128,step 0,loss: 0.03225, RMSE:0.03225,MSE:0.00104, MAE:0.02512, MAPE:0.10419--\n",
      "\n",
      "--------train epoch 128,step 3,loss: 0.03271, RMSE:0.03271,MSE:0.00107, MAE:0.02707, MAPE:0.09486--\n",
      "--------test loss: 0.05363, RMSE:0.05363,MSE:0.00288, MAPE:0.20324, RMSE_inv:0.20314, epoch time:0.62m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 43%|████▎     | 129/300 [00:38<01:22,  2.07it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.053892 --> 0.053631).  Saving model ...\n",
      "\n",
      "--------train epoch 129,step 0,loss: 0.03298, RMSE:0.03298,MSE:0.00109, MAE:0.02621, MAPE:0.13722--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 43%|████▎     | 130/300 [00:38<01:09,  2.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 129,step 3,loss: 0.02519, RMSE:0.02519,MSE:0.00063, MAE:0.02024, MAPE:0.07929--\n",
      "--------test loss: 0.05501, RMSE:0.05501,MSE:0.00303, MAPE:0.16358, RMSE_inv:0.20836, epoch time:0.63m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 130,step 0,loss: 0.03131, RMSE:0.03131,MSE:0.00098, MAE:0.02463, MAPE:0.07518--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▎     | 131/300 [00:38<01:02,  2.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 130,step 3,loss: 0.02552, RMSE:0.02552,MSE:0.00065, MAE:0.02055, MAPE:0.08534--\n",
      "--------test loss: 0.05700, RMSE:0.05700,MSE:0.00325, MAPE:0.15936, RMSE_inv:0.21589, epoch time:0.63m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 131,step 0,loss: 0.03589, RMSE:0.03589,MSE:0.00129, MAE:0.02738, MAPE:0.06614--\n",
      "\n",
      "--------train epoch 131,step 3,loss: 0.04080, RMSE:0.04080,MSE:0.00166, MAE:0.03248, MAPE:0.08898--\n",
      "--------test loss: 0.05276, RMSE:0.05276,MSE:0.00278, MAPE:0.14862, RMSE_inv:0.19985, epoch time:0.63m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▍     | 132/300 [00:39<01:12,  2.33it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.053631 --> 0.052764).  Saving model ...\n",
      "\n",
      "--------train epoch 132,step 0,loss: 0.03164, RMSE:0.03164,MSE:0.00100, MAE:0.02530, MAPE:0.13231--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▍     | 133/300 [00:39<01:02,  2.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 132,step 3,loss: 0.03596, RMSE:0.03596,MSE:0.00129, MAE:0.02866, MAPE:0.10143--\n",
      "--------test loss: 0.06779, RMSE:0.06779,MSE:0.00459, MAPE:0.25006, RMSE_inv:0.25675, epoch time:0.65m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 133,step 0,loss: 0.04229, RMSE:0.04229,MSE:0.00179, MAE:0.03337, MAPE:0.18676--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 45%|████▍     | 134/300 [00:39<00:55,  3.00it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 133,step 3,loss: 0.02836, RMSE:0.02836,MSE:0.00080, MAE:0.02285, MAPE:0.07807--\n",
      "--------test loss: 0.06013, RMSE:0.06013,MSE:0.00362, MAPE:0.14675, RMSE_inv:0.22775, epoch time:0.65m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 134,step 0,loss: 0.05339, RMSE:0.05339,MSE:0.00285, MAE:0.04068, MAPE:0.08804--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 45%|████▌     | 135/300 [00:39<00:50,  3.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 134,step 3,loss: 0.05088, RMSE:0.05088,MSE:0.00259, MAE:0.04175, MAPE:0.07634--\n",
      "--------test loss: 0.05912, RMSE:0.05912,MSE:0.00350, MAPE:0.19460, RMSE_inv:0.22394, epoch time:0.65m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 135,step 0,loss: 0.04728, RMSE:0.04728,MSE:0.00224, MAE:0.03988, MAPE:0.12966--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 45%|████▌     | 136/300 [00:40<00:47,  3.49it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 135,step 3,loss: 0.04438, RMSE:0.04438,MSE:0.00197, MAE:0.03336, MAPE:0.07852--\n",
      "--------test loss: 0.06412, RMSE:0.06412,MSE:0.00411, MAPE:0.27677, RMSE_inv:0.24287, epoch time:0.67m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 136,step 0,loss: 0.04432, RMSE:0.04432,MSE:0.00196, MAE:0.03451, MAPE:0.18822--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 46%|████▌     | 137/300 [00:40<00:44,  3.65it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 136,step 3,loss: 0.02666, RMSE:0.02666,MSE:0.00071, MAE:0.02254, MAPE:0.03854--\n",
      "--------test loss: 0.05421, RMSE:0.05421,MSE:0.00294, MAPE:0.19289, RMSE_inv:0.20531, epoch time:0.67m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 137,step 0,loss: 0.03941, RMSE:0.03941,MSE:0.00155, MAE:0.03113, MAPE:0.11841--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 46%|████▌     | 138/300 [00:40<00:42,  3.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 137,step 3,loss: 0.03630, RMSE:0.03630,MSE:0.00132, MAE:0.02800, MAPE:0.16557--\n",
      "Epoch 00138: reducing learning rate of group 0 to 6.8719e-06.\n",
      "--------test loss: 0.05962, RMSE:0.05962,MSE:0.00355, MAPE:0.17502, RMSE_inv:0.22582, epoch time:0.67m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 138,step 0,loss: 0.03819, RMSE:0.03819,MSE:0.00146, MAE:0.02940, MAPE:0.13748--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 47%|████▋     | 140/300 [00:40<00:36,  4.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 138,step 3,loss: 0.02647, RMSE:0.02647,MSE:0.00070, MAE:0.02214, MAPE:0.04882--\n",
      "--------test loss: 0.06824, RMSE:0.06824,MSE:0.00466, MAPE:0.14671, RMSE_inv:0.25845, epoch time:0.67m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 139,step 0,loss: 0.04435, RMSE:0.04435,MSE:0.00197, MAE:0.03519, MAPE:0.07466--\n",
      "\n",
      "--------train epoch 139,step 3,loss: 0.02904, RMSE:0.02904,MSE:0.00084, MAE:0.02393, MAPE:0.03808--\n",
      "--------test loss: 0.06126, RMSE:0.06126,MSE:0.00375, MAPE:0.20501, RMSE_inv:0.23202, epoch time:0.67m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 140,step 0,loss: 0.04393, RMSE:0.04393,MSE:0.00193, MAE:0.03404, MAPE:0.11874--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 47%|████▋     | 142/300 [00:41<00:29,  5.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 140,step 3,loss: 0.04131, RMSE:0.04131,MSE:0.00171, MAE:0.03529, MAPE:0.11747--\n",
      "--------test loss: 0.05296, RMSE:0.05296,MSE:0.00280, MAPE:0.18282, RMSE_inv:0.20060, epoch time:0.68m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 141,step 0,loss: 0.03096, RMSE:0.03096,MSE:0.00096, MAE:0.02454, MAPE:0.08287--\n",
      "\n",
      "--------train epoch 141,step 3,loss: 0.03582, RMSE:0.03582,MSE:0.00128, MAE:0.02909, MAPE:0.15459--\n",
      "--------test loss: 0.05597, RMSE:0.05597,MSE:0.00313, MAPE:0.16577, RMSE_inv:0.21201, epoch time:0.68m--\n",
      "EarlyStopping counter: 10 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 48%|████▊     | 143/300 [00:41<00:31,  4.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 142,step 0,loss: 0.03491, RMSE:0.03491,MSE:0.00122, MAE:0.02753, MAPE:0.12807--\n",
      "\n",
      "--------train epoch 142,step 3,loss: 0.03072, RMSE:0.03072,MSE:0.00094, MAE:0.02705, MAPE:0.10089--\n",
      "--------test loss: 0.06388, RMSE:0.06388,MSE:0.00408, MAPE:0.20236, RMSE_inv:0.24196, epoch time:0.68m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 143,step 0,loss: 0.04415, RMSE:0.04415,MSE:0.00195, MAE:0.03582, MAPE:0.14985--\n",
      "\n",
      "--------train epoch 143,step 3,loss: 0.04823, RMSE:0.04823,MSE:0.00233, MAE:0.03966, MAPE:0.10824--\n",
      "--------test loss: 0.05003, RMSE:0.05003,MSE:0.00250, MAPE:0.25496, RMSE_inv:0.18948, epoch time:0.68m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 48%|████▊     | 144/300 [00:42<00:48,  3.21it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.052764 --> 0.050026).  Saving model ...\n",
      "\n",
      "--------train epoch 144,step 0,loss: 0.03272, RMSE:0.03272,MSE:0.00107, MAE:0.02587, MAPE:0.09819--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 48%|████▊     | 145/300 [00:42<00:45,  3.44it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 144,step 3,loss: 0.03770, RMSE:0.03770,MSE:0.00142, MAE:0.03306, MAPE:0.06444--\n",
      "--------test loss: 0.05226, RMSE:0.05226,MSE:0.00273, MAPE:0.18796, RMSE_inv:0.19793, epoch time:0.70m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 145,step 0,loss: 0.04436, RMSE:0.04436,MSE:0.00197, MAE:0.03450, MAPE:0.10246--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 49%|████▊     | 146/300 [00:42<00:42,  3.63it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 145,step 3,loss: 0.03570, RMSE:0.03570,MSE:0.00127, MAE:0.03038, MAPE:0.06309--\n",
      "--------test loss: 0.05164, RMSE:0.05164,MSE:0.00267, MAPE:0.17632, RMSE_inv:0.19561, epoch time:0.70m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 146,step 0,loss: 0.03430, RMSE:0.03430,MSE:0.00118, MAE:0.02694, MAPE:0.09934--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 49%|████▉     | 147/300 [00:42<00:40,  3.79it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 146,step 3,loss: 0.03063, RMSE:0.03063,MSE:0.00094, MAE:0.02468, MAPE:0.07458--\n",
      "--------test loss: 0.05342, RMSE:0.05342,MSE:0.00285, MAPE:0.17107, RMSE_inv:0.20233, epoch time:0.70m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 147,step 0,loss: 0.03650, RMSE:0.03650,MSE:0.00133, MAE:0.02990, MAPE:0.12912--\n",
      "\n",
      "--------train epoch 147,step 3,loss: 0.02428, RMSE:0.02428,MSE:0.00059, MAE:0.01932, MAPE:0.05445--\n",
      "--------test loss: 0.05543, RMSE:0.05543,MSE:0.00307, MAPE:0.21114, RMSE_inv:0.20994, epoch time:0.70m--\n",
      "EarlyStopping counter: 4 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 50%|████▉     | 149/300 [00:43<00:30,  4.88it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 148,step 0,loss: 0.03634, RMSE:0.03634,MSE:0.00132, MAE:0.02941, MAPE:0.05221--\n",
      "\n",
      "--------train epoch 148,step 3,loss: 0.03371, RMSE:0.03371,MSE:0.00114, MAE:0.02606, MAPE:0.06567--\n",
      "--------test loss: 0.05253, RMSE:0.05253,MSE:0.00276, MAPE:0.13944, RMSE_inv:0.19898, epoch time:0.72m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 149,step 0,loss: 0.02748, RMSE:0.02748,MSE:0.00076, MAE:0.02311, MAPE:0.08932--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 50%|█████     | 150/300 [00:43<00:31,  4.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 149,step 3,loss: 0.03060, RMSE:0.03060,MSE:0.00094, MAE:0.02638, MAPE:0.16810--\n",
      "Epoch 00150: reducing learning rate of group 0 to 5.4976e-06.\n",
      "--------test loss: 0.05517, RMSE:0.05517,MSE:0.00304, MAPE:0.20002, RMSE_inv:0.20897, epoch time:0.72m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 150,step 0,loss: 0.03699, RMSE:0.03699,MSE:0.00137, MAE:0.03028, MAPE:0.15385--\n",
      "\n",
      "--------train epoch 150,step 3,loss: 0.02907, RMSE:0.02907,MSE:0.00085, MAE:0.02284, MAPE:0.08226--\n",
      "--------test loss: 0.04928, RMSE:0.04928,MSE:0.00243, MAPE:0.13983, RMSE_inv:0.18666, epoch time:0.72m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 50%|█████     | 151/300 [00:44<01:29,  1.66it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.050026 --> 0.049281).  Saving model ...\n",
      "\n",
      "--------train epoch 151,step 0,loss: 0.02854, RMSE:0.02854,MSE:0.00081, MAE:0.02306, MAPE:0.07276--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 51%|█████     | 152/300 [00:45<01:12,  2.03it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 151,step 3,loss: 0.02199, RMSE:0.02199,MSE:0.00048, MAE:0.01942, MAPE:0.12982--\n",
      "--------test loss: 0.05136, RMSE:0.05136,MSE:0.00264, MAPE:0.17531, RMSE_inv:0.19453, epoch time:0.75m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 152,step 0,loss: 0.02748, RMSE:0.02748,MSE:0.00075, MAE:0.02240, MAPE:0.09807--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 51%|█████     | 153/300 [00:45<01:01,  2.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 152,step 3,loss: 0.03553, RMSE:0.03553,MSE:0.00126, MAE:0.02629, MAPE:0.14602--\n",
      "--------test loss: 0.05146, RMSE:0.05146,MSE:0.00265, MAPE:0.20255, RMSE_inv:0.19490, epoch time:0.75m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 153,step 0,loss: 0.02197, RMSE:0.02197,MSE:0.00048, MAE:0.01754, MAPE:0.07886--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 51%|█████▏    | 154/300 [00:45<00:52,  2.76it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 153,step 3,loss: 0.02513, RMSE:0.02513,MSE:0.00063, MAE:0.02217, MAPE:0.07089--\n",
      "--------test loss: 0.05913, RMSE:0.05913,MSE:0.00350, MAPE:0.32119, RMSE_inv:0.22396, epoch time:0.75m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 154,step 0,loss: 0.02758, RMSE:0.02758,MSE:0.00076, MAE:0.02263, MAPE:0.07579--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 52%|█████▏    | 155/300 [00:45<00:47,  3.04it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 154,step 3,loss: 0.03436, RMSE:0.03436,MSE:0.00118, MAE:0.02920, MAPE:0.07904--\n",
      "--------test loss: 0.05768, RMSE:0.05768,MSE:0.00333, MAPE:0.27346, RMSE_inv:0.21848, epoch time:0.75m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 155,step 0,loss: 0.02682, RMSE:0.02682,MSE:0.00072, MAE:0.02049, MAPE:0.11267--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 52%|█████▏    | 156/300 [00:46<00:44,  3.27it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 155,step 3,loss: 0.02089, RMSE:0.02089,MSE:0.00044, MAE:0.01847, MAPE:0.05704--\n",
      "--------test loss: 0.05307, RMSE:0.05307,MSE:0.00282, MAPE:0.19421, RMSE_inv:0.20103, epoch time:0.77m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 156,step 0,loss: 0.02661, RMSE:0.02661,MSE:0.00071, MAE:0.02114, MAPE:0.07336--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 52%|█████▏    | 157/300 [00:46<00:40,  3.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 156,step 3,loss: 0.01478, RMSE:0.01478,MSE:0.00022, MAE:0.01235, MAPE:0.07296--\n",
      "Epoch 00157: reducing learning rate of group 0 to 4.3980e-06.\n",
      "--------test loss: 0.05223, RMSE:0.05223,MSE:0.00273, MAPE:0.23250, RMSE_inv:0.19783, epoch time:0.77m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 157,step 0,loss: 0.02767, RMSE:0.02767,MSE:0.00077, MAE:0.02214, MAPE:0.08768--\n",
      "\n",
      "--------train epoch 157,step 3,loss: 0.01959, RMSE:0.01959,MSE:0.00038, MAE:0.01560, MAPE:0.05977--\n",
      "--------test loss: 0.04837, RMSE:0.04837,MSE:0.00234, MAPE:0.14760, RMSE_inv:0.18321, epoch time:0.77m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 53%|█████▎    | 158/300 [00:46<00:56,  2.52it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.049281 --> 0.048369).  Saving model ...\n",
      "\n",
      "--------train epoch 158,step 0,loss: 0.02282, RMSE:0.02282,MSE:0.00052, MAE:0.01809, MAPE:0.09292--\n",
      "\n",
      "--------train epoch 158,step 3,loss: 0.02463, RMSE:0.02463,MSE:0.00061, MAE:0.02027, MAPE:0.06765--\n",
      "--------test loss: 0.04667, RMSE:0.04667,MSE:0.00218, MAPE:0.11198, RMSE_inv:0.17678, epoch time:0.78m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 53%|█████▎    | 159/300 [00:47<01:12,  1.93it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.048369 --> 0.046671).  Saving model ...\n",
      "\n",
      "--------train epoch 159,step 0,loss: 0.02627, RMSE:0.02627,MSE:0.00069, MAE:0.02009, MAPE:0.10061--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 53%|█████▎    | 160/300 [00:48<01:05,  2.13it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 159,step 3,loss: 0.03228, RMSE:0.03228,MSE:0.00104, MAE:0.02476, MAPE:0.50306--\n",
      "--------test loss: 0.04928, RMSE:0.04928,MSE:0.00243, MAPE:0.17281, RMSE_inv:0.18664, epoch time:0.80m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 160,step 0,loss: 0.02939, RMSE:0.02939,MSE:0.00086, MAE:0.02302, MAPE:0.10640--\n",
      "\n",
      "--------train epoch 160,step 3,loss: 0.02356, RMSE:0.02356,MSE:0.00056, MAE:0.01997, MAPE:0.04585--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 54%|█████▎    | 161/300 [00:48<00:54,  2.55it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.05898, RMSE:0.05898,MSE:0.00348, MAPE:0.19850, RMSE_inv:0.22339, epoch time:0.80m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 161,step 0,loss: 0.03637, RMSE:0.03637,MSE:0.00132, MAE:0.03006, MAPE:0.08941--\n",
      "\n",
      "--------train epoch 161,step 3,loss: 0.02579, RMSE:0.02579,MSE:0.00067, MAE:0.01938, MAPE:0.05627--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 54%|█████▍    | 162/300 [00:48<00:47,  2.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.05578, RMSE:0.05578,MSE:0.00311, MAPE:0.20372, RMSE_inv:0.21128, epoch time:0.80m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 162,step 0,loss: 0.02760, RMSE:0.02760,MSE:0.00076, MAE:0.02176, MAPE:0.09991--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 54%|█████▍    | 163/300 [00:48<00:42,  3.19it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 162,step 3,loss: 0.02355, RMSE:0.02355,MSE:0.00055, MAE:0.01870, MAPE:0.05173--\n",
      "--------test loss: 0.04915, RMSE:0.04915,MSE:0.00242, MAPE:0.17565, RMSE_inv:0.18618, epoch time:0.80m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 163,step 0,loss: 0.02680, RMSE:0.02680,MSE:0.00072, MAE:0.02215, MAPE:0.08206--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 55%|█████▍    | 164/300 [00:48<00:39,  3.42it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 163,step 3,loss: 0.02384, RMSE:0.02384,MSE:0.00057, MAE:0.01915, MAPE:0.04571--\n",
      "--------test loss: 0.04809, RMSE:0.04809,MSE:0.00231, MAPE:0.15101, RMSE_inv:0.18215, epoch time:0.82m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 164,step 0,loss: 0.02598, RMSE:0.02598,MSE:0.00067, MAE:0.02091, MAPE:0.09243--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 55%|█████▌    | 165/300 [00:49<00:37,  3.64it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 164,step 3,loss: 0.02030, RMSE:0.02030,MSE:0.00041, MAE:0.01587, MAPE:0.02841--\n",
      "Epoch 00165: reducing learning rate of group 0 to 3.5184e-06.\n",
      "--------test loss: 0.05232, RMSE:0.05232,MSE:0.00274, MAPE:0.26937, RMSE_inv:0.19816, epoch time:0.82m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 165,step 0,loss: 0.02078, RMSE:0.02078,MSE:0.00043, MAE:0.01562, MAPE:0.07285--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 55%|█████▌    | 166/300 [00:49<00:35,  3.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 165,step 3,loss: 0.02732, RMSE:0.02732,MSE:0.00075, MAE:0.01955, MAPE:0.03953--\n",
      "--------test loss: 0.04844, RMSE:0.04844,MSE:0.00235, MAPE:0.14906, RMSE_inv:0.18348, epoch time:0.82m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 166,step 0,loss: 0.02043, RMSE:0.02043,MSE:0.00042, MAE:0.01662, MAPE:0.05050--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 56%|█████▌    | 167/300 [00:49<00:33,  3.95it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 166,step 3,loss: 0.02567, RMSE:0.02567,MSE:0.00066, MAE:0.02041, MAPE:0.07163--\n",
      "--------test loss: 0.04852, RMSE:0.04852,MSE:0.00235, MAPE:0.13123, RMSE_inv:0.18378, epoch time:0.82m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 167,step 0,loss: 0.02267, RMSE:0.02267,MSE:0.00051, MAE:0.01731, MAPE:0.07537--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 56%|█████▌    | 168/300 [00:49<00:32,  4.03it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 167,step 3,loss: 0.02972, RMSE:0.02972,MSE:0.00088, MAE:0.01980, MAPE:0.06730--\n",
      "--------test loss: 0.05297, RMSE:0.05297,MSE:0.00281, MAPE:0.17592, RMSE_inv:0.20062, epoch time:0.82m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 168,step 0,loss: 0.02510, RMSE:0.02510,MSE:0.00063, MAE:0.01974, MAPE:0.11194--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 56%|█████▋    | 169/300 [00:50<00:31,  4.13it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 168,step 3,loss: 0.02120, RMSE:0.02120,MSE:0.00045, MAE:0.01731, MAPE:0.04118--\n",
      "--------test loss: 0.04704, RMSE:0.04704,MSE:0.00221, MAPE:0.16718, RMSE_inv:0.17818, epoch time:0.83m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 169,step 0,loss: 0.02122, RMSE:0.02122,MSE:0.00045, MAE:0.01615, MAPE:0.08097--\n",
      "\n",
      "--------train epoch 169,step 3,loss: 0.02278, RMSE:0.02278,MSE:0.00052, MAE:0.01771, MAPE:0.09770--\n",
      "--------test loss: 0.04513, RMSE:0.04513,MSE:0.00204, MAPE:0.16559, RMSE_inv:0.17093, epoch time:0.83m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 57%|█████▋    | 170/300 [00:50<00:46,  2.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.046671 --> 0.045128).  Saving model ...\n",
      "\n",
      "--------train epoch 170,step 0,loss: 0.02158, RMSE:0.02158,MSE:0.00047, MAE:0.01765, MAPE:0.07444--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 57%|█████▋    | 171/300 [00:51<00:41,  3.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 170,step 3,loss: 0.01827, RMSE:0.01827,MSE:0.00033, MAE:0.01519, MAPE:0.05471--\n",
      "--------test loss: 0.04636, RMSE:0.04636,MSE:0.00215, MAPE:0.13800, RMSE_inv:0.17558, epoch time:0.85m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 171,step 0,loss: 0.02294, RMSE:0.02294,MSE:0.00053, MAE:0.01897, MAPE:0.06810--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 57%|█████▋    | 172/300 [00:51<00:37,  3.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 171,step 3,loss: 0.01927, RMSE:0.01927,MSE:0.00037, MAE:0.01505, MAPE:0.02811--\n",
      "--------test loss: 0.04979, RMSE:0.04979,MSE:0.00248, MAPE:0.18185, RMSE_inv:0.18859, epoch time:0.85m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 172,step 0,loss: 0.02617, RMSE:0.02617,MSE:0.00068, MAE:0.02078, MAPE:0.07996--\n",
      "\n",
      "--------train epoch 172,step 3,loss: 0.03358, RMSE:0.03358,MSE:0.00113, MAE:0.02238, MAPE:0.03920--\n",
      "--------test loss: 0.04506, RMSE:0.04506,MSE:0.00203, MAPE:0.18295, RMSE_inv:0.17068, epoch time:0.85m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 58%|█████▊    | 173/300 [00:51<00:48,  2.64it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.045128 --> 0.045063).  Saving model ...\n",
      "\n",
      "--------train epoch 173,step 0,loss: 0.01732, RMSE:0.01732,MSE:0.00030, MAE:0.01324, MAPE:0.03761--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 58%|█████▊    | 174/300 [00:52<00:42,  2.97it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 173,step 3,loss: 0.02256, RMSE:0.02256,MSE:0.00051, MAE:0.01870, MAPE:0.03428--\n",
      "--------test loss: 0.04957, RMSE:0.04957,MSE:0.00246, MAPE:0.21062, RMSE_inv:0.18775, epoch time:0.87m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 174,step 0,loss: 0.02291, RMSE:0.02291,MSE:0.00052, MAE:0.01786, MAPE:0.05934--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 58%|█████▊    | 175/300 [00:52<00:38,  3.25it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 174,step 3,loss: 0.01912, RMSE:0.01912,MSE:0.00037, MAE:0.01510, MAPE:0.03893--\n",
      "--------test loss: 0.04852, RMSE:0.04852,MSE:0.00235, MAPE:0.14325, RMSE_inv:0.18376, epoch time:0.87m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 175,step 0,loss: 0.02355, RMSE:0.02355,MSE:0.00055, MAE:0.01881, MAPE:0.07388--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 59%|█████▊    | 176/300 [00:52<00:35,  3.48it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 175,step 3,loss: 0.01615, RMSE:0.01615,MSE:0.00026, MAE:0.01379, MAPE:0.02578--\n",
      "--------test loss: 0.04926, RMSE:0.04926,MSE:0.00243, MAPE:0.13681, RMSE_inv:0.18657, epoch time:0.87m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 176,step 0,loss: 0.02871, RMSE:0.02871,MSE:0.00082, MAE:0.02377, MAPE:0.12694--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 59%|█████▉    | 177/300 [00:52<00:33,  3.68it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 176,step 3,loss: 0.01744, RMSE:0.01744,MSE:0.00030, MAE:0.01547, MAPE:0.06493--\n",
      "--------test loss: 0.04655, RMSE:0.04655,MSE:0.00217, MAPE:0.17158, RMSE_inv:0.17630, epoch time:0.87m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 177,step 0,loss: 0.02409, RMSE:0.02409,MSE:0.00058, MAE:0.01917, MAPE:0.07841--\n",
      "\n",
      "--------train epoch 177,step 3,loss: 0.01910, RMSE:0.01910,MSE:0.00036, MAE:0.01546, MAPE:0.07065--\n",
      "--------test loss: 0.04452, RMSE:0.04452,MSE:0.00198, MAPE:0.15589, RMSE_inv:0.16863, epoch time:0.87m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 59%|█████▉    | 178/300 [00:53<00:50,  2.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.045063 --> 0.044520).  Saving model ...\n",
      "\n",
      "--------train epoch 178,step 0,loss: 0.02398, RMSE:0.02398,MSE:0.00058, MAE:0.01947, MAPE:0.06640--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 60%|█████▉    | 179/300 [00:53<00:45,  2.65it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 178,step 3,loss: 0.01994, RMSE:0.01994,MSE:0.00040, MAE:0.01614, MAPE:0.03894--\n",
      "--------test loss: 0.05139, RMSE:0.05139,MSE:0.00264, MAPE:0.18033, RMSE_inv:0.19465, epoch time:0.88m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 179,step 0,loss: 0.02854, RMSE:0.02854,MSE:0.00081, MAE:0.02297, MAPE:0.08192--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 60%|██████    | 180/300 [00:54<00:39,  3.00it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 179,step 3,loss: 0.01790, RMSE:0.01790,MSE:0.00032, MAE:0.01655, MAPE:0.06876--\n",
      "--------test loss: 0.04622, RMSE:0.04622,MSE:0.00214, MAPE:0.15405, RMSE_inv:0.17506, epoch time:0.90m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 180,step 0,loss: 0.02300, RMSE:0.02300,MSE:0.00053, MAE:0.01805, MAPE:0.12552--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 60%|██████    | 181/300 [00:54<00:35,  3.31it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 180,step 3,loss: 0.02545, RMSE:0.02545,MSE:0.00065, MAE:0.02122, MAPE:0.02448--\n",
      "--------test loss: 0.04699, RMSE:0.04699,MSE:0.00221, MAPE:0.14568, RMSE_inv:0.17799, epoch time:0.90m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 181,step 0,loss: 0.02551, RMSE:0.02551,MSE:0.00065, MAE:0.02089, MAPE:0.06649--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 61%|██████    | 182/300 [00:54<00:33,  3.54it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 181,step 3,loss: 0.01997, RMSE:0.01997,MSE:0.00040, MAE:0.01747, MAPE:0.03571--\n",
      "--------test loss: 0.04528, RMSE:0.04528,MSE:0.00205, MAPE:0.13613, RMSE_inv:0.17149, epoch time:0.90m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 182,step 0,loss: 0.01887, RMSE:0.01887,MSE:0.00036, MAE:0.01561, MAPE:0.09416--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 61%|██████▏   | 184/300 [00:54<00:26,  4.44it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 182,step 3,loss: 0.03254, RMSE:0.03254,MSE:0.00106, MAE:0.02882, MAPE:0.15103--\n",
      "--------test loss: 0.05181, RMSE:0.05181,MSE:0.00268, MAPE:0.21961, RMSE_inv:0.19623, epoch time:0.90m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 183,step 0,loss: 0.02169, RMSE:0.02169,MSE:0.00047, MAE:0.01705, MAPE:0.06191--\n",
      "\n",
      "--------train epoch 183,step 3,loss: 0.02396, RMSE:0.02396,MSE:0.00057, MAE:0.01866, MAPE:0.14326--\n",
      "Epoch 00184: reducing learning rate of group 0 to 2.8147e-06.\n",
      "--------test loss: 0.04861, RMSE:0.04861,MSE:0.00236, MAPE:0.19500, RMSE_inv:0.18412, epoch time:0.90m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 184,step 0,loss: 0.02086, RMSE:0.02086,MSE:0.00044, MAE:0.01642, MAPE:0.04979--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 62%|██████▏   | 185/300 [00:55<00:22,  5.03it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 184,step 3,loss: 0.01482, RMSE:0.01482,MSE:0.00022, MAE:0.01217, MAPE:0.01769--\n",
      "--------test loss: 0.04626, RMSE:0.04626,MSE:0.00214, MAPE:0.13336, RMSE_inv:0.17523, epoch time:0.92m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 185,step 0,loss: 0.01711, RMSE:0.01711,MSE:0.00029, MAE:0.01369, MAPE:0.03738--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 62%|██████▏   | 186/300 [00:55<00:23,  4.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 185,step 3,loss: 0.01776, RMSE:0.01776,MSE:0.00032, MAE:0.01527, MAPE:0.02593--\n",
      "--------test loss: 0.04533, RMSE:0.04533,MSE:0.00205, MAPE:0.14375, RMSE_inv:0.17168, epoch time:0.92m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 186,step 0,loss: 0.01909, RMSE:0.01909,MSE:0.00036, MAE:0.01529, MAPE:0.06894--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 63%|██████▎   | 188/300 [00:55<00:22,  4.99it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 186,step 3,loss: 0.01754, RMSE:0.01754,MSE:0.00031, MAE:0.01589, MAPE:0.15656--\n",
      "--------test loss: 0.04686, RMSE:0.04686,MSE:0.00220, MAPE:0.14133, RMSE_inv:0.17750, epoch time:0.92m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 187,step 0,loss: 0.02455, RMSE:0.02455,MSE:0.00060, MAE:0.01921, MAPE:0.04516--\n",
      "\n",
      "--------train epoch 187,step 3,loss: 0.01437, RMSE:0.01437,MSE:0.00021, MAE:0.01175, MAPE:0.02646--\n",
      "--------test loss: 0.04745, RMSE:0.04745,MSE:0.00225, MAPE:0.16737, RMSE_inv:0.17974, epoch time:0.92m--\n",
      "EarlyStopping counter: 10 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 63%|██████▎   | 189/300 [00:55<00:19,  5.62it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 188,step 0,loss: 0.02224, RMSE:0.02224,MSE:0.00049, MAE:0.01798, MAPE:0.09908--\n",
      "\n",
      "--------train epoch 188,step 3,loss: 0.01754, RMSE:0.01754,MSE:0.00031, MAE:0.01320, MAPE:0.05359--\n",
      "--------test loss: 0.04681, RMSE:0.04681,MSE:0.00219, MAPE:0.15757, RMSE_inv:0.17730, epoch time:0.92m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 189,step 0,loss: 0.02697, RMSE:0.02697,MSE:0.00073, MAE:0.02200, MAPE:0.11441--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 63%|██████▎   | 190/300 [00:55<00:18,  5.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 189,step 3,loss: 0.02036, RMSE:0.02036,MSE:0.00041, MAE:0.01757, MAPE:0.06780--\n",
      "Epoch 00190: reducing learning rate of group 0 to 2.2518e-06.\n",
      "--------test loss: 0.04789, RMSE:0.04789,MSE:0.00229, MAPE:0.14394, RMSE_inv:0.18139, epoch time:0.92m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 190,step 0,loss: 0.02530, RMSE:0.02530,MSE:0.00064, MAE:0.02098, MAPE:0.07764--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 64%|██████▎   | 191/300 [00:56<00:20,  5.24it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 190,step 3,loss: 0.01956, RMSE:0.01956,MSE:0.00038, MAE:0.01759, MAPE:0.10666--\n",
      "--------test loss: 0.04634, RMSE:0.04634,MSE:0.00215, MAPE:0.14929, RMSE_inv:0.17552, epoch time:0.93m--\n",
      "EarlyStopping counter: 13 out of 30\n",
      "\n",
      "--------train epoch 191,step 0,loss: 0.01534, RMSE:0.01534,MSE:0.00024, MAE:0.01151, MAPE:0.04276--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 64%|██████▍   | 192/300 [00:56<00:22,  4.88it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 191,step 3,loss: 0.01140, RMSE:0.01140,MSE:0.00013, MAE:0.00852, MAPE:0.07574--\n",
      "--------test loss: 0.04742, RMSE:0.04742,MSE:0.00225, MAPE:0.16144, RMSE_inv:0.17961, epoch time:0.93m--\n",
      "EarlyStopping counter: 14 out of 30\n",
      "\n",
      "--------train epoch 192,step 0,loss: 0.02063, RMSE:0.02063,MSE:0.00043, MAE:0.01583, MAPE:0.04310--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 64%|██████▍   | 193/300 [00:56<00:23,  4.62it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 192,step 3,loss: 0.02097, RMSE:0.02097,MSE:0.00044, MAE:0.01456, MAPE:0.17585--\n",
      "--------test loss: 0.04479, RMSE:0.04479,MSE:0.00201, MAPE:0.12577, RMSE_inv:0.16964, epoch time:0.93m--\n",
      "EarlyStopping counter: 15 out of 30\n",
      "\n",
      "--------train epoch 193,step 0,loss: 0.01740, RMSE:0.01740,MSE:0.00030, MAE:0.01371, MAPE:0.05509--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 65%|██████▍   | 194/300 [00:56<00:23,  4.50it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 193,step 3,loss: 0.01469, RMSE:0.01469,MSE:0.00022, MAE:0.01269, MAPE:0.13644--\n",
      "--------test loss: 0.04496, RMSE:0.04496,MSE:0.00202, MAPE:0.16436, RMSE_inv:0.17030, epoch time:0.93m--\n",
      "EarlyStopping counter: 16 out of 30\n",
      "\n",
      "--------train epoch 194,step 0,loss: 0.01729, RMSE:0.01729,MSE:0.00030, MAE:0.01348, MAPE:0.03443--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 65%|██████▌   | 195/300 [00:57<00:23,  4.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 194,step 3,loss: 0.01700, RMSE:0.01700,MSE:0.00029, MAE:0.01256, MAPE:0.03300--\n",
      "--------test loss: 0.04746, RMSE:0.04746,MSE:0.00225, MAPE:0.18429, RMSE_inv:0.17977, epoch time:0.95m--\n",
      "EarlyStopping counter: 17 out of 30\n",
      "\n",
      "--------train epoch 195,step 0,loss: 0.01909, RMSE:0.01909,MSE:0.00036, MAE:0.01594, MAPE:0.06091--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 65%|██████▌   | 196/300 [00:57<00:24,  4.29it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 195,step 3,loss: 0.01623, RMSE:0.01623,MSE:0.00026, MAE:0.01409, MAPE:0.03843--\n",
      "Epoch 00196: reducing learning rate of group 0 to 1.8014e-06.\n",
      "--------test loss: 0.04618, RMSE:0.04618,MSE:0.00213, MAPE:0.16082, RMSE_inv:0.17492, epoch time:0.95m--\n",
      "EarlyStopping counter: 18 out of 30\n",
      "\n",
      "--------train epoch 196,step 0,loss: 0.01486, RMSE:0.01486,MSE:0.00022, MAE:0.01164, MAPE:0.04703--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 66%|██████▌   | 198/300 [00:57<00:19,  5.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 196,step 3,loss: 0.01984, RMSE:0.01984,MSE:0.00039, MAE:0.01609, MAPE:0.25408--\n",
      "--------test loss: 0.04544, RMSE:0.04544,MSE:0.00206, MAPE:0.14038, RMSE_inv:0.17210, epoch time:0.95m--\n",
      "EarlyStopping counter: 19 out of 30\n",
      "\n",
      "--------train epoch 197,step 0,loss: 0.01782, RMSE:0.01782,MSE:0.00032, MAE:0.01415, MAPE:0.05919--\n",
      "\n",
      "--------train epoch 197,step 3,loss: 0.01657, RMSE:0.01657,MSE:0.00027, MAE:0.01410, MAPE:0.06254--\n",
      "--------test loss: 0.04741, RMSE:0.04741,MSE:0.00225, MAPE:0.17408, RMSE_inv:0.17958, epoch time:0.95m--\n",
      "EarlyStopping counter: 20 out of 30\n",
      "\n",
      "--------train epoch 198,step 0,loss: 0.01811, RMSE:0.01811,MSE:0.00033, MAE:0.01434, MAPE:0.04013--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 66%|██████▋   | 199/300 [00:57<00:17,  5.75it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 198,step 3,loss: 0.01559, RMSE:0.01559,MSE:0.00024, MAE:0.01145, MAPE:0.02463--\n",
      "--------test loss: 0.04501, RMSE:0.04501,MSE:0.00203, MAPE:0.11914, RMSE_inv:0.17050, epoch time:0.95m--\n",
      "EarlyStopping counter: 21 out of 30\n",
      "\n",
      "--------train epoch 199,step 0,loss: 0.01472, RMSE:0.01472,MSE:0.00022, MAE:0.01162, MAPE:0.04790--\n",
      "\n",
      "--------train epoch 199,step 3,loss: 0.01968, RMSE:0.01968,MSE:0.00039, MAE:0.01668, MAPE:0.04110--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 67%|██████▋   | 200/300 [00:58<00:18,  5.45it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.04483, RMSE:0.04483,MSE:0.00201, MAPE:0.15983, RMSE_inv:0.16980, epoch time:0.97m--\n",
      "EarlyStopping counter: 22 out of 30\n",
      "\n",
      "--------train epoch 200,step 0,loss: 0.01475, RMSE:0.01475,MSE:0.00022, MAE:0.01115, MAPE:0.04715--\n",
      "\n",
      "--------train epoch 200,step 3,loss: 0.01842, RMSE:0.01842,MSE:0.00034, MAE:0.01443, MAPE:0.03532--\n",
      "--------test loss: 0.04434, RMSE:0.04434,MSE:0.00197, MAPE:0.14474, RMSE_inv:0.16793, epoch time:0.97m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 67%|██████▋   | 201/300 [00:59<00:44,  2.20it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.044520 --> 0.044336).  Saving model ...\n",
      "\n",
      "--------train epoch 201,step 0,loss: 0.01494, RMSE:0.01494,MSE:0.00022, MAE:0.01062, MAPE:0.07284--\n",
      "\n",
      "--------train epoch 201,step 3,loss: 0.01495, RMSE:0.01495,MSE:0.00022, MAE:0.01117, MAPE:0.01828--\n",
      "--------test loss: 0.04391, RMSE:0.04391,MSE:0.00193, MAPE:0.14035, RMSE_inv:0.16631, epoch time:0.98m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 67%|██████▋   | 202/300 [00:59<00:45,  2.14it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.044336 --> 0.043909).  Saving model ...\n",
      "\n",
      "--------train epoch 202,step 0,loss: 0.01247, RMSE:0.01247,MSE:0.00016, MAE:0.00968, MAPE:0.02852--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 68%|██████▊   | 203/300 [00:59<00:38,  2.50it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 202,step 3,loss: 0.01815, RMSE:0.01815,MSE:0.00033, MAE:0.01308, MAPE:0.03856--\n",
      "--------test loss: 0.04453, RMSE:0.04453,MSE:0.00198, MAPE:0.14102, RMSE_inv:0.16867, epoch time:0.98m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 203,step 0,loss: 0.01271, RMSE:0.01271,MSE:0.00016, MAE:0.00947, MAPE:0.05064--\n",
      "\n",
      "--------train epoch 203,step 3,loss: 0.01109, RMSE:0.01109,MSE:0.00012, MAE:0.00920, MAPE:0.02202--\n",
      "--------test loss: 0.04336, RMSE:0.04336,MSE:0.00188, MAPE:0.12863, RMSE_inv:0.16425, epoch time:1.00m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 68%|██████▊   | 204/300 [01:00<00:56,  1.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.043909 --> 0.043364).  Saving model ...\n",
      "\n",
      "--------train epoch 204,step 0,loss: 0.01219, RMSE:0.01219,MSE:0.00015, MAE:0.00938, MAPE:0.02891--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 68%|██████▊   | 205/300 [01:01<00:46,  2.05it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 204,step 3,loss: 0.01366, RMSE:0.01366,MSE:0.00019, MAE:0.01154, MAPE:0.11875--\n",
      "--------test loss: 0.04388, RMSE:0.04388,MSE:0.00193, MAPE:0.11258, RMSE_inv:0.16620, epoch time:1.02m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 205,step 0,loss: 0.01308, RMSE:0.01308,MSE:0.00017, MAE:0.01014, MAPE:0.06560--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 69%|██████▊   | 206/300 [01:01<00:38,  2.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 205,step 3,loss: 0.01336, RMSE:0.01336,MSE:0.00018, MAE:0.01015, MAPE:0.05270--\n",
      "--------test loss: 0.04510, RMSE:0.04510,MSE:0.00203, MAPE:0.15211, RMSE_inv:0.17081, epoch time:1.02m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 206,step 0,loss: 0.01516, RMSE:0.01516,MSE:0.00023, MAE:0.01167, MAPE:0.05689--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 69%|██████▉   | 207/300 [01:01<00:33,  2.75it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 206,step 3,loss: 0.01632, RMSE:0.01632,MSE:0.00027, MAE:0.01124, MAPE:0.02278--\n",
      "--------test loss: 0.04415, RMSE:0.04415,MSE:0.00195, MAPE:0.11681, RMSE_inv:0.16721, epoch time:1.02m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 207,step 0,loss: 0.01775, RMSE:0.01775,MSE:0.00032, MAE:0.01392, MAPE:0.04207--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 70%|██████▉   | 209/300 [01:01<00:24,  3.79it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 207,step 3,loss: 0.00955, RMSE:0.00955,MSE:0.00009, MAE:0.00842, MAPE:0.05668--\n",
      "--------test loss: 0.04430, RMSE:0.04430,MSE:0.00196, MAPE:0.14345, RMSE_inv:0.16779, epoch time:1.02m--\n",
      "EarlyStopping counter: 4 out of 30\n",
      "\n",
      "--------train epoch 208,step 0,loss: 0.01324, RMSE:0.01324,MSE:0.00018, MAE:0.01054, MAPE:0.03332--\n",
      "\n",
      "--------train epoch 208,step 3,loss: 0.01321, RMSE:0.01321,MSE:0.00017, MAE:0.01066, MAPE:0.01520--\n",
      "--------test loss: 0.04642, RMSE:0.04642,MSE:0.00215, MAPE:0.18222, RMSE_inv:0.17583, epoch time:1.03m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 209,step 0,loss: 0.01309, RMSE:0.01309,MSE:0.00017, MAE:0.01064, MAPE:0.03623--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 70%|███████   | 210/300 [01:02<00:20,  4.48it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 209,step 3,loss: 0.01460, RMSE:0.01460,MSE:0.00021, MAE:0.01216, MAPE:0.02581--\n",
      "Epoch 00210: reducing learning rate of group 0 to 1.4412e-06.\n",
      "--------test loss: 0.04569, RMSE:0.04569,MSE:0.00209, MAPE:0.15138, RMSE_inv:0.17307, epoch time:1.03m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 210,step 0,loss: 0.01246, RMSE:0.01246,MSE:0.00016, MAE:0.00915, MAPE:0.03741--\n",
      "\n",
      "--------train epoch 210,step 3,loss: 0.01537, RMSE:0.01537,MSE:0.00024, MAE:0.01200, MAPE:0.02436--\n",
      "--------test loss: 0.04556, RMSE:0.04556,MSE:0.00208, MAPE:0.15602, RMSE_inv:0.17258, epoch time:1.03m--\n",
      "EarlyStopping counter: 7 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 71%|███████   | 212/300 [01:02<00:19,  4.54it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 211,step 0,loss: 0.01132, RMSE:0.01132,MSE:0.00013, MAE:0.00866, MAPE:0.02893--\n",
      "\n",
      "--------train epoch 211,step 3,loss: 0.01741, RMSE:0.01741,MSE:0.00030, MAE:0.01266, MAPE:0.04101--\n",
      "--------test loss: 0.04491, RMSE:0.04491,MSE:0.00202, MAPE:0.15385, RMSE_inv:0.17012, epoch time:1.03m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 212,step 0,loss: 0.01111, RMSE:0.01111,MSE:0.00012, MAE:0.00861, MAPE:0.02167--\n",
      "\n",
      "--------train epoch 212,step 3,loss: 0.01812, RMSE:0.01812,MSE:0.00033, MAE:0.01472, MAPE:0.02830--\n",
      "--------test loss: 0.04538, RMSE:0.04538,MSE:0.00206, MAPE:0.17837, RMSE_inv:0.17187, epoch time:1.03m--\n",
      "EarlyStopping counter: 9 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 71%|███████   | 213/300 [01:02<00:19,  4.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 213,step 0,loss: 0.01413, RMSE:0.01413,MSE:0.00020, MAE:0.01049, MAPE:0.04699--\n",
      "\n",
      "--------train epoch 213,step 3,loss: 0.01139, RMSE:0.01139,MSE:0.00013, MAE:0.00900, MAPE:0.01801--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 72%|███████▏  | 215/300 [01:03<00:18,  4.59it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------test loss: 0.04422, RMSE:0.04422,MSE:0.00196, MAPE:0.15172, RMSE_inv:0.16748, epoch time:1.05m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 214,step 0,loss: 0.01070, RMSE:0.01070,MSE:0.00011, MAE:0.00845, MAPE:0.02329--\n",
      "\n",
      "--------train epoch 214,step 3,loss: 0.01087, RMSE:0.01087,MSE:0.00012, MAE:0.00876, MAPE:0.02651--\n",
      "--------test loss: 0.04425, RMSE:0.04425,MSE:0.00196, MAPE:0.14433, RMSE_inv:0.16760, epoch time:1.05m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 215,step 0,loss: 0.01190, RMSE:0.01190,MSE:0.00014, MAE:0.00837, MAPE:0.02470--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 72%|███████▏  | 216/300 [01:03<00:16,  5.19it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 215,step 3,loss: 0.01380, RMSE:0.01380,MSE:0.00019, MAE:0.01145, MAPE:0.03804--\n",
      "Epoch 00216: reducing learning rate of group 0 to 1.1529e-06.\n",
      "--------test loss: 0.04385, RMSE:0.04385,MSE:0.00192, MAPE:0.11753, RMSE_inv:0.16609, epoch time:1.05m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 216,step 0,loss: 0.01306, RMSE:0.01306,MSE:0.00017, MAE:0.01008, MAPE:0.03734--\n",
      "\n",
      "--------train epoch 216,step 3,loss: 0.01180, RMSE:0.01180,MSE:0.00014, MAE:0.00950, MAPE:0.02664--\n",
      "--------test loss: 0.04318, RMSE:0.04318,MSE:0.00186, MAPE:0.11829, RMSE_inv:0.16357, epoch time:1.05m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 72%|███████▏  | 217/300 [01:03<00:24,  3.33it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.043364 --> 0.043184).  Saving model ...\n",
      "\n",
      "--------train epoch 217,step 0,loss: 0.01350, RMSE:0.01350,MSE:0.00018, MAE:0.01012, MAPE:0.03672--\n",
      "\n",
      "--------train epoch 217,step 3,loss: 0.01264, RMSE:0.01264,MSE:0.00016, MAE:0.00995, MAPE:0.05331--\n",
      "--------test loss: 0.04244, RMSE:0.04244,MSE:0.00180, MAPE:0.12237, RMSE_inv:0.16074, epoch time:1.07m--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 73%|███████▎  | 219/300 [01:04<00:26,  3.02it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss decreased (0.043184 --> 0.042439).  Saving model ...\n",
      "\n",
      "--------train epoch 218,step 0,loss: 0.01012, RMSE:0.01012,MSE:0.00010, MAE:0.00791, MAPE:0.03415--\n",
      "\n",
      "--------train epoch 218,step 3,loss: 0.01181, RMSE:0.01181,MSE:0.00014, MAE:0.00765, MAPE:0.02659--\n",
      "--------test loss: 0.04342, RMSE:0.04342,MSE:0.00189, MAPE:0.15120, RMSE_inv:0.16445, epoch time:1.07m--\n",
      "EarlyStopping counter: 1 out of 30\n",
      "\n",
      "--------train epoch 219,step 0,loss: 0.01101, RMSE:0.01101,MSE:0.00012, MAE:0.00878, MAPE:0.04025--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 74%|███████▎  | 221/300 [01:04<00:18,  4.35it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 219,step 3,loss: 0.01820, RMSE:0.01820,MSE:0.00033, MAE:0.01186, MAPE:0.05437--\n",
      "--------test loss: 0.04508, RMSE:0.04508,MSE:0.00203, MAPE:0.17528, RMSE_inv:0.17076, epoch time:1.07m--\n",
      "EarlyStopping counter: 2 out of 30\n",
      "\n",
      "--------train epoch 220,step 0,loss: 0.01015, RMSE:0.01015,MSE:0.00010, MAE:0.00800, MAPE:0.03026--\n",
      "\n",
      "--------train epoch 220,step 3,loss: 0.00799, RMSE:0.00799,MSE:0.00006, MAE:0.00638, MAPE:0.02138--\n",
      "--------test loss: 0.04475, RMSE:0.04475,MSE:0.00200, MAPE:0.17420, RMSE_inv:0.16950, epoch time:1.07m--\n",
      "EarlyStopping counter: 3 out of 30\n",
      "\n",
      "--------train epoch 221,step 0,loss: 0.01312, RMSE:0.01312,MSE:0.00017, MAE:0.01000, MAPE:0.02090--\n",
      "\n",
      "--------train epoch 221,step 3,loss: 0.01012, RMSE:0.01012,MSE:0.00010, MAE:0.00859, MAPE:0.02986--\n",
      "--------test loss: 0.04425, RMSE:0.04425,MSE:0.00196, MAPE:0.15766, RMSE_inv:0.16760, epoch time:1.08m--\n",
      "EarlyStopping counter: 4 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 74%|███████▍  | 223/300 [01:05<00:17,  4.31it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 222,step 0,loss: 0.01323, RMSE:0.01323,MSE:0.00018, MAE:0.01031, MAPE:0.03397--\n",
      "\n",
      "--------train epoch 222,step 3,loss: 0.01699, RMSE:0.01699,MSE:0.00029, MAE:0.01389, MAPE:0.02942--\n",
      "--------test loss: 0.04306, RMSE:0.04306,MSE:0.00185, MAPE:0.12601, RMSE_inv:0.16311, epoch time:1.08m--\n",
      "EarlyStopping counter: 5 out of 30\n",
      "\n",
      "--------train epoch 223,step 0,loss: 0.01344, RMSE:0.01344,MSE:0.00018, MAE:0.00970, MAPE:0.02064--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 75%|███████▌  | 225/300 [01:05<00:13,  5.61it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 223,step 3,loss: 0.01096, RMSE:0.01096,MSE:0.00012, MAE:0.00979, MAPE:0.01935--\n",
      "Epoch 00224: reducing learning rate of group 0 to 1.0000e-06.\n",
      "--------test loss: 0.04451, RMSE:0.04451,MSE:0.00198, MAPE:0.15750, RMSE_inv:0.16857, epoch time:1.08m--\n",
      "EarlyStopping counter: 6 out of 30\n",
      "\n",
      "--------train epoch 224,step 0,loss: 0.01337, RMSE:0.01337,MSE:0.00018, MAE:0.01065, MAPE:0.04219--\n",
      "\n",
      "--------train epoch 224,step 3,loss: 0.01224, RMSE:0.01224,MSE:0.00015, MAE:0.00848, MAPE:0.02630--\n",
      "--------test loss: 0.04444, RMSE:0.04444,MSE:0.00197, MAPE:0.13660, RMSE_inv:0.16831, epoch time:1.08m--\n",
      "EarlyStopping counter: 7 out of 30\n",
      "\n",
      "--------train epoch 225,step 0,loss: 0.01257, RMSE:0.01257,MSE:0.00016, MAE:0.00995, MAPE:0.03825--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 75%|███████▌  | 226/300 [01:05<00:12,  6.09it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 225,step 3,loss: 0.01130, RMSE:0.01130,MSE:0.00013, MAE:0.00810, MAPE:0.00835--\n",
      "--------test loss: 0.04449, RMSE:0.04449,MSE:0.00198, MAPE:0.16268, RMSE_inv:0.16853, epoch time:1.08m--\n",
      "EarlyStopping counter: 8 out of 30\n",
      "\n",
      "--------train epoch 226,step 0,loss: 0.01174, RMSE:0.01174,MSE:0.00014, MAE:0.00886, MAPE:0.03535--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 76%|███████▌  | 227/300 [01:06<00:13,  5.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 226,step 3,loss: 0.01157, RMSE:0.01157,MSE:0.00013, MAE:0.00986, MAPE:0.02629--\n",
      "--------test loss: 0.04489, RMSE:0.04489,MSE:0.00202, MAPE:0.15585, RMSE_inv:0.17004, epoch time:1.10m--\n",
      "EarlyStopping counter: 9 out of 30\n",
      "\n",
      "--------train epoch 227,step 0,loss: 0.01230, RMSE:0.01230,MSE:0.00015, MAE:0.00925, MAPE:0.03156--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 76%|███████▌  | 228/300 [01:06<00:14,  5.02it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 227,step 3,loss: 0.01116, RMSE:0.01116,MSE:0.00012, MAE:0.00957, MAPE:0.07848--\n",
      "--------test loss: 0.04435, RMSE:0.04435,MSE:0.00197, MAPE:0.15014, RMSE_inv:0.16797, epoch time:1.10m--\n",
      "EarlyStopping counter: 10 out of 30\n",
      "\n",
      "--------train epoch 228,step 0,loss: 0.01099, RMSE:0.01099,MSE:0.00012, MAE:0.00854, MAPE:0.02873--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 76%|███████▋  | 229/300 [01:06<00:15,  4.73it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 228,step 3,loss: 0.01173, RMSE:0.01173,MSE:0.00014, MAE:0.00959, MAPE:0.03587--\n",
      "--------test loss: 0.04580, RMSE:0.04580,MSE:0.00210, MAPE:0.17742, RMSE_inv:0.17348, epoch time:1.10m--\n",
      "EarlyStopping counter: 11 out of 30\n",
      "\n",
      "--------train epoch 229,step 0,loss: 0.01374, RMSE:0.01374,MSE:0.00019, MAE:0.01047, MAPE:0.03823--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 77%|███████▋  | 231/300 [01:06<00:13,  5.19it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 229,step 3,loss: 0.01703, RMSE:0.01703,MSE:0.00029, MAE:0.01438, MAPE:0.03603--\n",
      "--------test loss: 0.04423, RMSE:0.04423,MSE:0.00196, MAPE:0.13574, RMSE_inv:0.16755, epoch time:1.10m--\n",
      "EarlyStopping counter: 12 out of 30\n",
      "\n",
      "--------train epoch 230,step 0,loss: 0.01310, RMSE:0.01310,MSE:0.00017, MAE:0.01019, MAPE:0.04138--\n",
      "\n",
      "--------train epoch 230,step 3,loss: 0.01611, RMSE:0.01611,MSE:0.00026, MAE:0.01273, MAPE:0.02734--\n",
      "--------test loss: 0.04521, RMSE:0.04521,MSE:0.00204, MAPE:0.18010, RMSE_inv:0.17124, epoch time:1.10m--\n",
      "EarlyStopping counter: 13 out of 30\n",
      "\n",
      "--------train epoch 231,step 0,loss: 0.01310, RMSE:0.01310,MSE:0.00017, MAE:0.00999, MAPE:0.03405--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 78%|███████▊  | 233/300 [01:07<00:11,  5.59it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 231,step 3,loss: 0.01039, RMSE:0.01039,MSE:0.00011, MAE:0.00859, MAPE:0.03044--\n",
      "--------test loss: 0.04484, RMSE:0.04484,MSE:0.00201, MAPE:0.14930, RMSE_inv:0.16985, epoch time:1.12m--\n",
      "EarlyStopping counter: 14 out of 30\n",
      "\n",
      "--------train epoch 232,step 0,loss: 0.01324, RMSE:0.01324,MSE:0.00018, MAE:0.01032, MAPE:0.03318--\n",
      "\n",
      "--------train epoch 232,step 3,loss: 0.01490, RMSE:0.01490,MSE:0.00022, MAE:0.00970, MAPE:0.01289--\n",
      "--------test loss: 0.04343, RMSE:0.04343,MSE:0.00189, MAPE:0.15202, RMSE_inv:0.16449, epoch time:1.12m--\n",
      "EarlyStopping counter: 15 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 78%|███████▊  | 234/300 [01:07<00:12,  5.11it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 233,step 0,loss: 0.01115, RMSE:0.01115,MSE:0.00012, MAE:0.00862, MAPE:0.03013--\n",
      "\n",
      "--------train epoch 233,step 3,loss: 0.01247, RMSE:0.01247,MSE:0.00016, MAE:0.01057, MAPE:0.07366--\n",
      "--------test loss: 0.04340, RMSE:0.04340,MSE:0.00188, MAPE:0.14372, RMSE_inv:0.16438, epoch time:1.12m--\n",
      "EarlyStopping counter: 16 out of 30\n",
      "\n",
      "--------train epoch 234,step 0,loss: 0.00941, RMSE:0.00941,MSE:0.00009, MAE:0.00732, MAPE:0.01888--\n",
      "\n",
      "--------train epoch 234,step 3,loss: 0.01198, RMSE:0.01198,MSE:0.00014, MAE:0.00977, MAPE:0.02639--\n",
      "--------test loss: 0.04498, RMSE:0.04498,MSE:0.00202, MAPE:0.16477, RMSE_inv:0.17036, epoch time:1.12m--\n",
      "EarlyStopping counter: 17 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 79%|███████▊  | 236/300 [01:07<00:14,  4.55it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 235,step 0,loss: 0.01231, RMSE:0.01231,MSE:0.00015, MAE:0.00910, MAPE:0.04706--\n",
      "\n",
      "--------train epoch 235,step 3,loss: 0.01320, RMSE:0.01320,MSE:0.00017, MAE:0.01191, MAPE:0.04786--\n",
      "--------test loss: 0.04425, RMSE:0.04425,MSE:0.00196, MAPE:0.15965, RMSE_inv:0.16762, epoch time:1.12m--\n",
      "EarlyStopping counter: 18 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 79%|███████▉  | 237/300 [01:08<00:14,  4.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 236,step 0,loss: 0.01054, RMSE:0.01054,MSE:0.00011, MAE:0.00815, MAPE:0.02621--\n",
      "\n",
      "--------train epoch 236,step 3,loss: 0.01624, RMSE:0.01624,MSE:0.00026, MAE:0.01311, MAPE:0.04222--\n",
      "--------test loss: 0.04363, RMSE:0.04363,MSE:0.00190, MAPE:0.12292, RMSE_inv:0.16527, epoch time:1.13m--\n",
      "EarlyStopping counter: 19 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 79%|███████▉  | 238/300 [01:08<00:14,  4.28it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 237,step 0,loss: 0.01277, RMSE:0.01277,MSE:0.00016, MAE:0.00950, MAPE:0.03970--\n",
      "\n",
      "--------train epoch 237,step 3,loss: 0.01012, RMSE:0.01012,MSE:0.00010, MAE:0.00757, MAPE:0.02103--\n",
      "--------test loss: 0.04384, RMSE:0.04384,MSE:0.00192, MAPE:0.14257, RMSE_inv:0.16605, epoch time:1.13m--\n",
      "EarlyStopping counter: 20 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 80%|███████▉  | 239/300 [01:08<00:14,  4.30it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 238,step 0,loss: 0.01052, RMSE:0.01052,MSE:0.00011, MAE:0.00819, MAPE:0.04235--\n",
      "\n",
      "--------train epoch 238,step 3,loss: 0.01304, RMSE:0.01304,MSE:0.00017, MAE:0.00906, MAPE:0.02213--\n",
      "--------test loss: 0.04454, RMSE:0.04454,MSE:0.00198, MAPE:0.14386, RMSE_inv:0.16870, epoch time:1.13m--\n",
      "EarlyStopping counter: 21 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 80%|████████  | 240/300 [01:08<00:13,  4.34it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 239,step 0,loss: 0.01185, RMSE:0.01185,MSE:0.00014, MAE:0.00924, MAPE:0.03772--\n",
      "\n",
      "--------train epoch 239,step 3,loss: 0.00795, RMSE:0.00795,MSE:0.00006, MAE:0.00676, MAPE:0.01215--\n",
      "--------test loss: 0.04401, RMSE:0.04401,MSE:0.00194, MAPE:0.14070, RMSE_inv:0.16671, epoch time:1.13m--\n",
      "EarlyStopping counter: 22 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 80%|████████  | 241/300 [01:09<00:13,  4.33it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 240,step 0,loss: 0.01065, RMSE:0.01065,MSE:0.00011, MAE:0.00786, MAPE:0.03129--\n",
      "\n",
      "--------train epoch 240,step 3,loss: 0.00945, RMSE:0.00945,MSE:0.00009, MAE:0.00833, MAPE:0.02845--\n",
      "--------test loss: 0.04406, RMSE:0.04406,MSE:0.00194, MAPE:0.14399, RMSE_inv:0.16689, epoch time:1.15m--\n",
      "EarlyStopping counter: 23 out of 30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 81%|████████  | 242/300 [01:09<00:12,  4.80it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 241,step 0,loss: 0.01061, RMSE:0.01061,MSE:0.00011, MAE:0.00820, MAPE:0.03401--\n",
      "\n",
      "--------train epoch 241,step 3,loss: 0.01048, RMSE:0.01048,MSE:0.00011, MAE:0.00816, MAPE:0.04650--\n",
      "--------test loss: 0.04310, RMSE:0.04310,MSE:0.00186, MAPE:0.13504, RMSE_inv:0.16323, epoch time:1.15m--\n",
      "EarlyStopping counter: 24 out of 30\n",
      "\n",
      "--------train epoch 242,step 0,loss: 0.01188, RMSE:0.01188,MSE:0.00014, MAE:0.00913, MAPE:0.03580--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 81%|████████▏ | 244/300 [01:09<00:09,  5.89it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 242,step 3,loss: 0.00995, RMSE:0.00995,MSE:0.00010, MAE:0.00855, MAPE:0.02556--\n",
      "--------test loss: 0.04587, RMSE:0.04587,MSE:0.00210, MAPE:0.15632, RMSE_inv:0.17376, epoch time:1.15m--\n",
      "EarlyStopping counter: 25 out of 30\n",
      "\n",
      "--------train epoch 243,step 0,loss: 0.01421, RMSE:0.01421,MSE:0.00020, MAE:0.01181, MAPE:0.03330--\n",
      "\n",
      "--------train epoch 243,step 3,loss: 0.01794, RMSE:0.01794,MSE:0.00032, MAE:0.01417, MAPE:0.03231--\n",
      "--------test loss: 0.04378, RMSE:0.04378,MSE:0.00192, MAPE:0.11366, RMSE_inv:0.16582, epoch time:1.15m--\n",
      "EarlyStopping counter: 26 out of 30\n",
      "\n",
      "--------train epoch 244,step 0,loss: 0.01266, RMSE:0.01266,MSE:0.00016, MAE:0.00977, MAPE:0.03169--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 82%|████████▏ | 245/300 [01:09<00:10,  5.24it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 244,step 3,loss: 0.01046, RMSE:0.01046,MSE:0.00011, MAE:0.00806, MAPE:0.03092--\n",
      "--------test loss: 0.04387, RMSE:0.04387,MSE:0.00192, MAPE:0.14766, RMSE_inv:0.16617, epoch time:1.15m--\n",
      "EarlyStopping counter: 27 out of 30\n",
      "\n",
      "--------train epoch 245,step 0,loss: 0.01163, RMSE:0.01163,MSE:0.00014, MAE:0.00891, MAPE:0.03937--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 82%|████████▏ | 246/300 [01:10<00:10,  4.93it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 245,step 3,loss: 0.01002, RMSE:0.01002,MSE:0.00010, MAE:0.00643, MAPE:0.12136--\n",
      "--------test loss: 0.04330, RMSE:0.04330,MSE:0.00187, MAPE:0.12830, RMSE_inv:0.16400, epoch time:1.17m--\n",
      "EarlyStopping counter: 28 out of 30\n",
      "\n",
      "--------train epoch 246,step 0,loss: 0.01038, RMSE:0.01038,MSE:0.00011, MAE:0.00779, MAPE:0.01689--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 82%|████████▏ | 247/300 [01:10<00:11,  4.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 246,step 3,loss: 0.00863, RMSE:0.00863,MSE:0.00007, MAE:0.00759, MAPE:0.05813--\n",
      "--------test loss: 0.04315, RMSE:0.04315,MSE:0.00186, MAPE:0.14089, RMSE_inv:0.16345, epoch time:1.17m--\n",
      "EarlyStopping counter: 29 out of 30\n",
      "\n",
      "--------train epoch 247,step 0,loss: 0.01111, RMSE:0.01111,MSE:0.00012, MAE:0.00874, MAPE:0.02430--\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 82%|████████▏ | 247/300 [01:10<00:15,  3.50it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--------train epoch 247,step 3,loss: 0.01009, RMSE:0.01009,MSE:0.00010, MAE:0.00868, MAPE:0.10087--\n",
      "--------test loss: 0.04480, RMSE:0.04480,MSE:0.00201, MAPE:0.15615, RMSE_inv:0.16967, epoch time:1.17m--\n",
      "EarlyStopping counter: 30 out of 30\n",
      "Early stopping\n",
      "0408_153945  end\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "##### early stopping #####\n",
    "patience = 30\n",
    "early_stopping = EarlyStopping(patience, verbose=True)\n",
    "\n",
    "##### start train #####\n",
    "total_train_step = 0\n",
    "min_loss, best_epoch = float('inf'), float('inf')\n",
    "best_rmse_inverse,best_mae_inverse,best_mape_inverse = float('inf'),float('inf'),float('inf')\n",
    "\n",
    "print(train_info + '  start')\n",
    "epoch = 300\n",
    "for e in tqdm(range(epoch)):\n",
    "\n",
    "    ##### training #####\n",
    "    total_train_loss = 0\n",
    "    train_num = 0\n",
    "    model.train()  \n",
    "    for step, i in enumerate(train_dataloader):\n",
    "        \n",
    "        # get the model input\n",
    "        i = i.to(torch.float32)\n",
    "        input_pe = model.pe_know[i[:,0].type(torch.long)]\n",
    "        input_coods = i[:, 1:3].to(device)\n",
    "        input_feature = i[:, 3:3+d_input].to(device)\n",
    "        input_feature[:,-1] = 0\n",
    "        \n",
    "        # model execution\n",
    "        optimizer.zero_grad()\n",
    "        output, _ = model(input_coods, input_feature, input_pe, known_coods_scaler, known_feature_scaler)\n",
    "\n",
    "        # calculate loss and optimize the model\n",
    "        target = i[:, -1].to(device)\n",
    "        loss = criterion(output, target)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        # diagnose the output\n",
    "        diag = DIAGNOSIS(output, target)\n",
    "        l_rmse, l_mse, l_mae, l_mape = diag.get()\n",
    "        \n",
    "        # tensorboard summary\n",
    "        if if_summary:\n",
    "            total_train_step = total_train_step + 1\n",
    "            writer.add_scalar(\"train_loss\", loss, total_train_step)\n",
    "            writer.add_scalar(\"train_rmse\", l_rmse, total_train_step)\n",
    "            writer.add_scalar(\"train_mae\", l_mae, total_train_step)\n",
    "            writer.add_scalar(\"train_mape\", l_mape, total_train_step)\n",
    "        \n",
    "        # print the training log\n",
    "        total_train_loss = total_train_loss + loss.item()\n",
    "        train_num +=1\n",
    "        if step % 3 == 0:\n",
    "            print('\\n--------train epoch {},step {},loss: {:.5f}, RMSE:{:.5f},MSE:{:.5f}, MAE:{:.5f}, MAPE:{:.5f}--'\n",
    "                    .format(e, step, loss.item(), l_rmse, l_mse, l_mae, l_mape))\n",
    "    \n",
    "    # tensorboard summary\n",
    "    total_train_loss = total_train_loss/train_num\n",
    "    if if_summary:\n",
    "        writer.add_scalar(\"total_train_loss\", total_train_loss, e)\n",
    "\n",
    "    ##### testing #####\n",
    "    total_test_loss, l2p, l3p, l4p = 0, 0, 0, 0\n",
    "    lrmse_inverse,lmae_inverse,lmape_inverse = 0,0,0\n",
    "    test_num = 0\n",
    "    with torch.no_grad():\n",
    "        model.eval()  # set the model to evaluation mode\n",
    "        for step, i in enumerate(test_dataloader):\n",
    "\n",
    "            # get the model input\n",
    "            i = i.to(torch.float32)\n",
    "            input_pe = model.pe_unknow[i[:,0].type(torch.long)]\n",
    "            input_coods = i[:, 1:3].to(device)\n",
    "            input_feature = i[:, 3:3+d_input].to(device)\n",
    "            input_feature[:,-1] = 0\n",
    "            \n",
    "            # model execution\n",
    "            output, _ = model(input_coods, input_feature, input_pe, known_coods_scaler, known_feature_scaler)\n",
    "            \n",
    "            # diagnose the output\n",
    "            target = i[:, -1].to(device)\n",
    "            test_loss = criterion(output, target)\n",
    "            test_diag = DIAGNOSIS(output, target)\n",
    "            t_rmse, t_mse, _, t_mape = test_diag.get()\n",
    "            total_test_loss += test_loss.item()\n",
    "            l2p += t_rmse\n",
    "            l3p += t_mse\n",
    "            l4p += t_mape\n",
    "            \n",
    "            # inverse the scaled output and calculate the diagnosis\n",
    "            output_inverse = dataset.scaler_label.inverse_transform(output.cpu().reshape(-1, 1))\n",
    "            target_inverse = dataset.scaler_label.inverse_transform(target.cpu().reshape(-1, 1))\n",
    "            test_diag_inverse = DIAGNOSIS(output_inverse, target_inverse)\n",
    "            lrmse_inverse += test_diag_inverse.v_rmse\n",
    "            lmae_inverse += test_diag_inverse.v_mae\n",
    "            lmape_inverse += test_diag_inverse.v_mape\n",
    "\n",
    "            test_num = test_num + 1\n",
    "\n",
    "        # calculate the final result\n",
    "        final_loss = total_test_loss / test_num\n",
    "        final_rmse = l2p / test_num\n",
    "        final_mse = l3p / test_num\n",
    "        final_mape = l4p / test_num\n",
    "        final_rmse_inverse = lrmse_inverse / test_num\n",
    "        final_mae_inverse = lmae_inverse / test_num\n",
    "        final_mape_inverse = lmape_inverse / test_num\n",
    "\n",
    "        # adjust learning rate \n",
    "        scheduler.step(final_loss)\n",
    "\n",
    "        # tensorboard summary\n",
    "        if if_summary:\n",
    "            writer.add_scalar(\"total_test_loss\", final_loss, e)\n",
    "            writer.add_scalar('lr', optimizer.state_dict()['param_groups'][0]['lr'], e)\n",
    "\n",
    "        # print the log\n",
    "        end_time = datetime.datetime.now()\n",
    "        print('--------test loss: {:.5f}, RMSE:{:.5f},MSE:{:.5f}, MAPE:{:.5f}, RMSE_inv:{:.5f}, epoch time:{:.2f}m--'\n",
    "            .format(final_loss, final_rmse, final_mse, final_mape, final_rmse_inverse, (end_time-start_time).seconds/60))\n",
    "        \n",
    "        # save the best model parameters and info\n",
    "        if final_loss < min_loss:\n",
    "            min_loss = final_loss\n",
    "            best_epoch = e\n",
    "            best_rmse_inverse = final_rmse_inverse\n",
    "            best_mae_inverse = final_mae_inverse\n",
    "            best_mape_inverse = final_mape_inverse\n",
    "            \n",
    "            if not os.path.exists(save_dir):\n",
    "                os.makedirs(save_dir)\n",
    "            \n",
    "            # save the model parameters\n",
    "            torch.save(model.state_dict(), save_dir + '/checkpoint.pth')\n",
    "            \n",
    "            # save the model info\n",
    "            with open(save_dir + '/checkpoint_info.txt', 'w') as f:\n",
    "                f.write('-----------model_info-------------')\n",
    "                f.write('\\rmodel name:  dknn\\r')\n",
    "                f.write('train info:  {}\\r'.format(train_info))\n",
    "                f.write('min loss:  {}\\r'.format(min_loss))\n",
    "                f.write('best_epoch:  {}\\r'.format(best_epoch))\n",
    "                f.write('best_rmse_inverse:  {}\\r'.format(best_rmse_inverse))\n",
    "                f.write('best inverse MAE/RMSE/MAPE: {:.2f}/{:.2f}/{:.2f}%\\r'\n",
    "                    .format(best_mae_inverse,best_rmse_inverse,best_mape_inverse*100))\n",
    "                f.write('spend time: {} minutes\\r'.format((datetime.datetime.now()-start_time).seconds/60))\n",
    "                f.write('epoch: {}\\r'.format(e))\n",
    "        \n",
    "        ##### early stopping #####\n",
    "        early_stopping(final_loss, model, save_model_dir=None)\n",
    "        if early_stopping.early_stop:\n",
    "            print(\"Early stopping\")\n",
    "            break\n",
    "\n",
    "# close the tensorboard summary\n",
    "if if_summary:\n",
    "    writer.close()\n",
    "\n",
    "print(train_info + '  end')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Print the results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Print the best results from the training process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "******** SRF5s1_112_rand0.05s10_s5 *********\n",
      "final min loss: 0.04243868961930275\n",
      "best_epoch: 217\n",
      "best inverse MAE/RMSE/MAPE: 0.11/0.16/1.86%\n",
      "spend time: 1.166667 minutes\n"
     ]
    }
   ],
   "source": [
    "print('******** {} *********'.format(datafilename))\n",
    "print('final min loss:', min_loss)\n",
    "print('best_epoch:', best_epoch)\n",
    "print('best inverse MAE/RMSE/MAPE: {:.2f}/{:.2f}/{:.2f}%'\n",
    "    .format(best_mae_inverse,best_rmse_inverse,best_mape_inverse*100))\n",
    "end_time = datetime.datetime.now()\n",
    "print('spend time: {:3f} minutes'.format((end_time-start_time).seconds/60))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## View summary log in TensorBoard"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "View all summary logs in the results folder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(summarypath)\n",
    "%load_ext tensorboard\n",
    "# %reload_ext tensorboard\n",
    "%tensorboard --logdir results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predicting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Predicting the entire random field based on the saved best model parameters"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Read the random field"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Obtain the corresponding random field filename based on the filename of the sampled dataset, and then read the random field"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   id  coodx  coody        z1        z2        z3    target     trend\n",
      "0   0      0      0  1.476121  0.622109  2.622554  2.855310  0.000000\n",
      "1   1      1      0  1.653220  0.607631  2.553660  2.953624  0.075758\n",
      "2   2      2      0  1.801497  0.574328  2.477688  3.023731  0.151515\n",
      "3   3      3      0  1.914332  0.523565  2.395788  3.064235  0.227273\n",
      "4   4      4      0  1.984676  0.456571  2.309130  3.073481  0.303030\n"
     ]
    }
   ],
   "source": [
    "# get the name of radom field file\n",
    "RFname = datafilename[0: datafilename[0: datafilename.rfind('_')].rfind('_')]\n",
    "# read the random field\n",
    "RFdata = pd.read_csv('./Data/random_field/' + RFname + '.csv')\n",
    "print(RFdata.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Process the random field data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scaling random field data based on the dataset instance, and then convert to dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                id         coodx         coody            z1            z2  \\\n",
      "count  10000.00000  10000.000000  10000.000000  10000.000000  10000.000000   \n",
      "mean    4999.50000      0.500000      0.500000      0.015355     -0.010246   \n",
      "std     2886.89568      0.291591      0.291591      0.993287      0.982991   \n",
      "min        0.00000      0.000000      0.000000     -3.250882     -2.601981   \n",
      "25%     2499.75000      0.250000      0.250000     -0.584505     -0.713196   \n",
      "50%     4999.50000      0.500000      0.500000      0.085602     -0.001390   \n",
      "75%     7499.25000      0.750000      0.750000      0.679372      0.636372   \n",
      "max     9999.00000      1.000000      1.000000      3.034328      2.831922   \n",
      "\n",
      "                 z3        target  \n",
      "count  10000.000000  10000.000000  \n",
      "mean       0.001528      0.098825  \n",
      "std        0.970327      1.000795  \n",
      "min       -3.451642     -2.006201  \n",
      "25%       -0.589056     -0.681430  \n",
      "50%        0.117757      0.071362  \n",
      "75%        0.634360      0.808235  \n",
      "max        2.386410      2.261546  \n"
     ]
    }
   ],
   "source": [
    "RFdata_scaler = RFdata.copy()\n",
    "\n",
    "# Remove the redundant column\n",
    "if 'trend' in RFdata_scaler.columns:\n",
    "    RFdata_scaler = RFdata_scaler.drop('trend',axis=1, inplace=False)\n",
    "\n",
    "# scale the data\n",
    "RFdata_scaler.iloc[:, 1:3] = dataset.scaler_coods.transform(RFdata_scaler.values[:, 1:3])\n",
    "RFdata_scaler.iloc[:, 3:-1] = dataset.scaler_features.transform(RFdata_scaler.values[:, 3:-1])\n",
    "RFdata_scaler.iloc[:,-1] = dataset.scaler_label.transform(RFdata_scaler.values[:, -1].reshape(-1,1))\n",
    "\n",
    "# get the dataloader\n",
    "RF_dataloader = DataLoader(RFdata_scaler.values, shuffle=False, batch_size=500, drop_last=False)\n",
    "print(RFdata_scaler.describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load the best model parameters"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Read the model parameters that achieve the best performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DKNN(\n",
       "  (AttRe): Attribute_Rep(\n",
       "    (dense1): Dense(\n",
       "      (fc): Linear(in_features=4, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense2): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense3): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (relu): PReLU(num_parameters=1)\n",
       "  )\n",
       "  (Pgrn): PGRN(\n",
       "    (dense1): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense12): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense2): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (dense3): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (sigmoid): Sigmoid()\n",
       "    (bn): BatchNorm1d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  )\n",
       "  (Ssan): SSAN(\n",
       "    (map_query): Linear(in_features=256, out_features=256, bias=False)\n",
       "    (map_key): Linear(in_features=256, out_features=256, bias=False)\n",
       "  )\n",
       "  (MetaPN): MetaPN(\n",
       "    (ml1_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=512, bias=True)\n",
       "    )\n",
       "    (ml1_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (ml2_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=65536, bias=True)\n",
       "    )\n",
       "    (ml2_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=256, bias=True)\n",
       "    )\n",
       "    (ml3_w): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=4096, bias=True)\n",
       "    )\n",
       "    (ml3_b): Dense(\n",
       "      (fc): Linear(in_features=256, out_features=16, bias=True)\n",
       "    )\n",
       "    (relu): PReLU(num_parameters=1)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Model initialization\n",
    "net = DKNN(d_input=d_input, d_model=d_model, known_num=dataset.train_num, d_trend=d_trend, top_k=top_k, pe_weight=pe_weight)\n",
    "\n",
    "# load the best model parameters\n",
    "net.load_state_dict(torch.load(save_dir + '/checkpoint.pth',map_location=torch.device(device)))\n",
    "\n",
    "# Calculate positional embedding before training to increase the speed of training\n",
    "net.cal_pe_know(known_feature_scaler, known_coods_scaler)\n",
    "net.cal_pe_unknow(torch.from_numpy(RFdata_scaler.values[:, 3:3+d_input].astype(float)).to(torch.float32).to(device),\n",
    "                    torch.from_numpy(RFdata_scaler.values[:, 1:3].astype(float)).to(torch.float32).to(device)) \n",
    "net.to(device)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicting process"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Iterate for model predicting, interpolating the entire random field"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 20/20 [00:00<00:00, 52.14it/s]\n"
     ]
    }
   ],
   "source": [
    "RFoutput = []\n",
    "with torch.no_grad():\n",
    "    net.eval()  # set the model to evaluation mode\n",
    "    for i in tqdm(RF_dataloader):\n",
    "        # model input\n",
    "        i = i.to(torch.float32)\n",
    "        input_feature = i[:, 3:3+d_input].to(device)\n",
    "        input_feature[:,-1] = 0\n",
    "        input_coods = i[:, 1:3].to(device)\n",
    "        if net.pe_unknow is not None:\n",
    "            input_pe = net.pe_unknow[i[:,0].type(torch.long)]  # The positional embeddings have been calculated in advance, get it according to the index\n",
    "        else:\n",
    "            input_pe = net.position_rep(input_feature, input_coods[:, 0], input_coods[:, 1])  # The positional embeddings are not calculated in advance\n",
    "        # model execution\n",
    "        output, _ = net(input_coods, input_feature, input_pe, known_coods_scaler, known_feature_scaler)\n",
    "        RFoutput.extend(output.cpu().detach().numpy())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Diagnose the output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since the original data has been scaled, the scaled data needs to be inverted for the diagnosis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MAE/RMSE/MAPE: 0.12/0.17/7.28%, RF_mse:0.0299, RF_R2:0.9979\n"
     ]
    }
   ],
   "source": [
    "# reverse the output\n",
    "RFoutput_inverse = dataset.scaler_label.inverse_transform(np.array(RFoutput).reshape(-1,1))\n",
    "\n",
    "# diagnose the reversed output\n",
    "RF_diag_inverse = DIAGNOSIS(RFoutput_inverse, RFdata['target'].values.reshape(-1,1))\n",
    "RF_rmse_inverse, RF_mse_inverse, RF_mae_inverse, RF_mape_inverse = RF_diag_inverse.get()\n",
    "\n",
    "# print diagnostic results\n",
    "print('MAE/RMSE/MAPE: {:.2f}/{:.2f}/{:.2f}%, RF_mse:{:.4f}, RF_R2:{:.4f}'.format(RF_mae_inverse, RF_rmse_inverse, RF_mape_inverse*100, RF_mse_inverse, RF_diag_inverse.v_r2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Save the results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Saving diagnostic results and random field predicted results separately"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   id  coodx  coody        z1        z2        z3    target     trend  \\\n",
      "0   0      0      0  1.476121  0.622109  2.622554  2.855310  0.000000   \n",
      "1   1      1      0  1.653220  0.607631  2.553660  2.953624  0.075758   \n",
      "2   2      2      0  1.801497  0.574328  2.477688  3.023731  0.151515   \n",
      "3   3      3      0  1.914332  0.523565  2.395788  3.064235  0.227273   \n",
      "4   4      4      0  1.984676  0.456571  2.309130  3.073481  0.303030   \n",
      "\n",
      "    predict  \n",
      "0  3.035855  \n",
      "1  2.994245  \n",
      "2  2.934718  \n",
      "3  2.852442  \n",
      "4  2.785728  \n"
     ]
    }
   ],
   "source": [
    "##### save the predict result and diagnostic results #####\n",
    "# save the predict result\n",
    "RFdata['predict'] = np.array(RFoutput_inverse)\n",
    "RFdata.to_csv(save_dir + '/RFresult.csv', index=False)\n",
    "\n",
    "# save diagnostic results\n",
    "with open(save_dir + '/RFresult_diag.txt', 'w') as f:\n",
    "    f.write('-----------Diagnosis-------------')\n",
    "    f.write('\\rinverse: MAE/RMSE/MAPE: {:.2f}/{:.2f}/{:.2f}%, RF_mse:{:.4f}, RF_R2:{:.4f}'.format(RF_mae_inverse, RF_rmse_inverse, RF_mape_inverse*100, RF_mse_inverse, RF_diag_inverse.v_r2))\n",
    "\n",
    "print(RFdata.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualisation of true and predicted values of random field"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compare and save the spatial distribution map of true and predicted values for the whole random field"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABPoAAAHqCAYAAACdlCCQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADfVklEQVR4nOy9fZQmZ1nnf9XzdE/PTJiZmGhmkh8TCDIIJLxJQhRYEo4QRUARlIMgAu66cROEmNUggjIiJAdUTjigQXCBKAb9Q952XSA5KyS6qOQFlA2aiIYY4cSgYoa8zXQ/Vb8/OtPT9b2urqvq6erup/v5fM6Zc6aq7rrrrpen6lvVVZ+7qKqqMgAAAAAAAAAAANjUDDa6AQAAAAAAAAAAALB6eNAHAAAAAAAAAACwBeBBHwAAAAAAAAAAwBaAB30AAAAAAAAAAABbAB70AQAAAAAAAAAAbAF40AcAAAAAAAAAALAF4EEfAAAAAAAAAADAFoAHfQAAAAAAAAAAAFsAHvQBAAAAAAAAAABsAXjQBwAAAAAAAFueD37wg1YUhb3yla+sjf/sZz9rRVHYueeeuy7tKIrCiqJYl2UBwPTBgz6ACeHyyy+3gwcP2n/8x39sdFMAAAAAAGAMPvjBD9rBgwftq1/96kY3BQCmlJmNbgAALHL55Zfb7bffbq985Svt+OOP3+jmAAAAAABMBTt37rTv+q7vslNPPXXVdX3wgx+0a6+91s4991x7+MMfHpb5ru/6rlUvBwBgJXjQBwAAAAAAAFPLU57yFPu7v/u7dVveei4LAKYPPt0FAAAAAAAAAADYAvCgD2CDOSoFvv32283M7LTTTlsS9BZFYZ/97GdrguCFhQV7+9vfbo973ONs586dS58EfPWrX7WiKFb8RMCsWfy7sLBg73nPe+zpT3+6HX/88bZ9+3Z79KMfbW984xvt0KFDfa82AAAAAGxylmfLq666yp7ylKfYQx7yEDvhhBPsBS94gf2///f/wvke/vCHW1EU9tWvftU+85nP2HOe8xz79m//9qXse5T77rvP3va2t9mZZ55pu3fvtp07d9oTn/hE+/Vf/3U7fPhwWHdVVfa7v/u79sQnPtF27NhhJ510kr3kJS+xr3zlKyuuR9YZx3333We/8Ru/Yd/zPd9jxx9/vO3cudMOHDhgL3/5y+3aa6+t1XF0+JnPfGYt03/wgx8Mt5ty77332lve8hZ7/OMfb8cdd5zt3r3bzj77bPut3/otW1hYaGx7WZb2zne+08444wzbvn277d271/7zf/7P9o1vfGPFdQeArQef7gJsMHv37rWnPe1pdsMNN9jhw4ftzDPPtLm5uaXpe/bssbvvvtvMFoPLC17wAvuTP/kT+87v/E577GMfaw888MCq23Do0CF7/vOfb9ddd50NBgPbv3+/7dq1y2699VZ761vfah/5yEfss5/9rJ100kmrXhYAAAAAbC3e/va32+te9zrbt2+fPeYxj7FbbrnFPv7xj9vVV19tV199tT396U8P5/vwhz9sb3zjG23Pnj32yEc+0nbs2LE07Wtf+5qdd9559uUvf9lmZmbs4Q9/uM3OztrNN99sl1xyiX3iE5+wq6++ujaPmdmFF15oV1xxhZktPlA84YQT7GMf+5h9+tOftgsuuKDzuv3TP/2T/cAP/ID97d/+rZmZHThwwHbt2mVf/epX7UMf+pDdcccd9tnPftb27NljT3va0+xLX/qSHTp0yM444wzbs2fPUj179+5Nl/WNb3zDvu/7vs++9KUv2WAwsDPOOMPm5+ft85//vH3+85+3j3/84/aJT3zCtm/fHs7/8pe/3K666io7cOCAPfKRj7RbbrnF3v/+99tf/dVf2Y033li7xwCALUwFABPBwx72sMrMqttuu81N+8xnPlOZWTUcDquTTjqp+tznPrc07f7776+qqqpuu+22ysyqhz3sYSsuw8yq6Gf/kpe8pDKz6vu+7/uqf/iHf1ga/+///u/VC1/4wsrMqh/90R8df+UAAAAAYMtxNFvOzs5Wv/mbv1mNRqOqqqrq3nvvrV72spctZdP77ruvNt/R3DscDqtf/dVfrebn56uqqqqyLKsHHnigGo1G1VOf+tTKzKqXvOQl1Z133rk07x133FH9p//0nyozq37+53++Vu/HP/7xysyqubm56o//+I+Xxt91113VueeeW83OzlZmVr3iFa+ozXc0a59zzjm18QsLC9WTn/zkysyqM888s/ryl79cm/6FL3yh+u3f/u3auHPOOacys+ozn/lMut2UF73oRZWZVaeffnr1la98ZWn89ddfX+3du7cys+qSSy4J2z47O1udcsop1V/91V8tTbvllluqhz70oZWZVVdcccWK7QGArQWf7gJsIkajkV1xxRX2vd/7vUvjVvqLXlv+5m/+xv7wD//QHvawh9lHP/pRe8QjHrE07du+7dvs93//923//v32x3/8x0ufFwMAAAAAHOU5z3mOXXzxxTYYLN5e7ty5097//vfbvn377Pbbb7c//MM/DOf7wR/8QfuVX/kVm5lZ/NCsKAqbm5uzP/mTP7HPfe5zdtZZZ9nv//7v196Ge+hDH2p/9Ed/ZA95yEPsPe95j91///1L037913/dzMxe85rX2Atf+MKl8d/xHd9hH/7wh1f8XHYlPvKRj9iNN95oJ510kn3qU5+yxzzmMbXpT3ziE+2//bf/1qnOlfj7v/97+8hHPmJmZr//+79v3/md37k07cwzz7R3vetdZmb2W7/1W/atb33LzT8/P2/vete77ClPecrSuEc96lF2ySWXmJnZJz/5yV7aCQCTDw/6ADYRe/bssR/+4R/utc6PfvSjZmb24he/2Hbt2uWm79y50571rGdZVVX2Z3/2Z70uGwAAAAA2PxdeeKEbt23bNvsv/+W/mJnZpz/96XC+n/zJnwzHH33g9cpXvnLpIeByTj75ZDvrrLPsnnvusRtvvNHMzO655x773Oc+Z2YWPnzbt29f7eFfGz7+8Y+bmdlP/dRP2Yknnthp3q5cc801VlWVPf3pT7cnPelJbvqLXvQie+hDH2r33nuv/d//+3/d9G/7tm8L1++ss84yM7N//Md/7L/RADCR4OgD2EQcOHDAhsNhr3V+6UtfMrPFB35Hw5Fy9E2+r33ta70uGwAAAAA2P/qmm46/9dZbO813NJ9eccUVdtVVV4VljtZ5NJ9+5StfsbIsbfv27Xbaaad1Wt5KHPXyfc/3fE+n+cbh6Po89rGPDacPBgN79KMfbf/8z/9st956q/3AD/xAbfryNwCXc9Sxfc899/TYWgCYZHjQB7CJOO6443qv82hHH1/5ylcaeyMzs9qnEQAAAAAAZrZih21HP7mNPjU1WznbHs2nK/Xau5yj+fTog6xv//ZvX7Fsmw4xlnPo0CEzMzv++OM7zTcOR9vf1Pld0/ZcaVse/Zy6qqrVNhEANgk86APYIhx1jqx0Eb/33nvD8Q95yEPMzOx973vf0ucVAAAAAABt+cY3vmEPfehD3fi77rrLzCzUwzRxNJ9ec8019qxnPavTPP/6r/+6Ypmj7WnL0Xb/x3/8R6f5xuFo+5va+C//8i+1dgEARODoA5gQusqBlaN/xfvGN74RTl/pbb2jnwe0+YspAAAAAIBy9BPXlcY/6lGP6lTfOPn0kY98pA0GA3vggQfsq1/9aqd2rsTpp59uZmZ/+Zd/2XqecTP90W305S9/OZxelqX93d/9Xa0sAEAED/oAJoQdO3aY2fifx5544om2Z88eu//+++3mm29203/3d383nO9HfuRHzMzsQx/6kP3bv/3bWMsGAAAAgOnlt3/7t924I0eO2P/4H//DzMzOO++8TvUd7VTid37nd+yBBx5oNc9DHvIQ+97v/V4zM3vPe97jpv/Lv/zLUicfbXnBC15gZmbvf//77d///d9bzTNupj/vvPOsKAr78z//c/vCF77gpn/kIx+xf/7nf7bjjjvOnva0p3WqGwCmCx70AUwIj3jEI8zM7Nprrx1r/qIo7Pu///vNzOziiy+uCXevvPJKe//73x/Od+aZZ9qLX/xi+7d/+zd79rOf7YLFaDSyz372s/ayl73MDh8+PFbbAAAAAGDr8id/8if2zne+c0khc//999tP//RP29e//nXbv3+/veQlL+lU34/8yI/Y93zP99jf/d3f2fOf/3z3Zcrhw4ftT/7kT+ynfuqnauN//ud/3szM3vnOd9rHPvaxpfH/+q//ai972cusLMtO7XjBC15gZ555pt111132gz/4g3bLLbfUpv/1X/+1XXHFFbVx42b6Rz7ykUsPOH/yJ3+y1kvuTTfdZK95zWvMzOzVr341n+4CQDMVAEwEv/d7v1eZWWVm1RlnnFGdc8451TnnnFN94QtfqD7zmc9UZladc845jXX87d/+bfWQhzykMrPquOOOq777u7+7Ovnkkyszq6644oql+pVvfetb1bOf/eyl6aeeemp19tlnV4973OOqHTt2LI2///7712jtAQAAAGCzcTQjvu1tb6vMrNq3b1911llnVbt3767MrNq+fXt17bXXuvke9rCHVWZW3XbbbSvW/fWvf7160pOetLSMRz7ykdXZZ59dPfaxj622bdtWmVm1d+9eN99//a//dWme0047rXryk59cbd++vTr++OOrX/qlX6rMrHrFK15Rm6cpa99+++3Vd33Xdy3V+ahHPap68pOfXJ144onhPNddd12t7DOe8YzqnHPOqT75yU+67abcdddd1eMe97jKzKrhcFg94QlPqB772MculX/Ws57l8nh2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tSO85fM8UAUnXFg3NueDPgAAgClnGj47AAAAAADok2nI0J1f7fja175mP/ETP2Ennnii7dy50574xCfajTfeuDS9qio7ePCgnXLKKbZjxw4799xz7eabb+610QAAAAAAmwkyNAAAAKwHnR70ffOb37SnPe1pNjs7a5/85Cfty1/+sv3mb/6mHX/88Utl3v72t9s73vEOe/e7323XX3+97du3z5797Gfbt771rb7bDgAAML1UPf8DgDWDDA0AADAhTEGG7vTp7tve9jbbv3+/feADH1ga9/CHP3zp/1VV2eWXX25veMMb7IUvfKGZmV155ZW2d+9eu+qqq+z8889vvayiWuZoaOWUay6Tu9yiRtQHK1MXRvNedf6SqF2Jsy9zkURlUj+hugVKvx7O86dlMinHQtBQdYs4f54UV0di5FUR5Va6n9usxip/rOHbu6mTLykfPZJXb0pHl8hg6PeRulrcsDrlBuqxCJqp8yR1zKh/L3T0rb+Tb6ROSd0BQRPUW6Eukfmk2W2cH7PywxjabOP07YMjrg51bqi/ZCQGk23iL5kN2qnexAx18s0HMiF18KlfT4fVyRf5+Lwz5thy1dsycfT42UEunQWA1bCeGdps8Se9qp91kk+dq61FjlbfWxYlwziVZUWdnvj1onFdnXyxo6/ZyVeMVCZYX49o0zjf2zDJ0boeQZZU/3WWm9vcl2TzuP3eJi64ezIZdn695vkXx3V08unsgffPu66TLO5ydOB/S7K40oe3uo2TT1HnXtmQr8wCt3WkUUxy8Lx59/Jy1LdnZnakqC9Xs7nL3u7Q8nXqvc0RuUHdplm8qCfM+UJE9uZdgLNBma7ofYmSOfnUu2jmPYjL57lvkh19U5ChO73R94lPfMLOPPNM+7Ef+zE76aST7ElPepK9733vW5p+22232Z133mnnnXfe0ri5uTk755xz7HOf+1xY5+HDh+3QoUO1fwAAAAAAW4W1yNBm5GgAAADwdHrQ94//+I92xRVX2IEDB+zTn/60/czP/Iy95jWvsd/7vd8zM7M777zTzMz27t1bm2/v3r1L05TLLrvM9uzZs/Rv//7946wHAADAVFFV/f4DgLVjLTK0GTkaAACgK9OQoTs96CvL0r77u7/bLr30UnvSk55k559/vv30T/+0XXHFFbVyhXziVlWVG3eU17/+9Xb33Xcv/bvjjjs6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",
      "text/plain": [
       "<Figure size 1500x500 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def visualize_field_pre(filepath):\n",
    "    ##### Visualize the true and predicted random field #####\n",
    "    data = pd.read_csv(filepath)\n",
    "    columns=['target', 'predict']\n",
    "    titles=['true', 'prediction']\n",
    "    fig = plt.figure(figsize=(15,5))\n",
    "    for i in range(2):\n",
    "        ax = plt.subplot(1, 2, i+1)\n",
    "        plt.imshow(data[columns[i]].values.reshape(100, 100))\n",
    "        plt.colorbar()\n",
    "        plt.gca().invert_yaxis()\n",
    "        plt.title(titles[i], fontsize=16)\n",
    "    plt.tight_layout()\n",
    "    plt.savefig(filepath[0: filepath.rfind('/')] + '/RFresult_visualize.png', dpi=300, bbox_inches='tight')\n",
    "\n",
    "visualize_field_pre(save_dir + '/RFresult.csv')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py388",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
